Как преобразовать число ASCII 057836 в упакованное число BCD, используя 8086

У меня проблемы с преобразованием чисел ASCII в числа BCD. Я знаю, что преобразование небольших чисел выполняется путем вычитания 30h из каждого числа, но с этим большим числом я не знаю, как с ним справиться, я подумал о делении числа на байты, но не уверен, правильна ли эта идея или не..

Любая помощь или предложения?

1 ответ

Упакованный номер BCD 057836 не помещается в один 16-битный регистр. emu8086 не позволяет использовать 32-битные регистры, поскольку это было возможно в 16-битном режиме начиная с процессора 80386. Итак, используйте два регистра, чтобы получить упакованный BCD. я использовал AX а также DX, Чтобы получить место для нового номера BCD в самых правых 4 битах AX, вы должны сдвинуть влево на 4 бита AX в DX:

.MODEL small

.DATA
    bcd db "057836", 0

.CODE

main PROC
    mov ax, @data           ; Initialize DS
    mov ds, ax

    mov si, OFFSET bcd      ; Initialize registers for the loop
    mov ax, 0
    mov dx, 0

    loo:                    ; Loop through the ASCII string
    mov bl, [si]            ; Get a character
    cmp bl, 0               ; End of String reached?
    je endloo               ; Yes -> exit the loop

    ; Make space for a bcd number shifting left 4 bits from AX to DX
    ; 4 single shifts because emu8086 doesn't support `SHLD`
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1
    shl ax, 1
    rcl dx, 1

    and bl, 0Fh             ; Delete the ASCII-part (same as sub bl, 30h)
    or al, bl               ; Transfer number from bl to al

    inc si                  ; Next character
    jmp loo                 ; Once more
    endloo:

    ; At this point the register pair DX:AX contains the packed BCD number

    mov ax, 4C00h           ; Exit (0)
    int 21h                 ; Call MSDOS
main ENDP

END main
Другие вопросы по тегам