Как преобразовать число 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