Упакованный 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