我无法将ASCII编号转换为BCD编号。 我知道转换小数字是通过从每个数字中减去30h来完成的,但是对于这个大数字,我不知道如何处理它,因此我想将数字划分为字节,但是不确定这种想法是否正确或不是..
有什么帮助或建议吗?
答案 0 :(得分:2)
打包的BCD编号057836不适用于单个16位寄存器。 emu8086不允许使用32位寄存器,因为自80386处理器以来,它已经可以在16位模式下使用。因此,使用两个寄存器来获取打包的BCD。我使用了AX
和DX
。要在AX
的最右边4位中找到新的BCD编号,您必须将AX
的4位左移到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