我正在尝试将压缩十进制数转换为 ascii 字符串。到目前为止,这是我的理解:
以下:
bcd BYTE 34h
“解包”后应转换为十进制数 34。现在我不确定这样做的最佳方式。如果我将此十六进制数转换为二进制,则如下...
0011 0100
现在,如果我的程序一次打印出每个 4 位二进制值,那么它应该打印 ascii 数字字符串,对吗?所以如果我通过一个循环,获取第一个 4 位二进制数,打印出它的实际值,它会打印 3.. 然后做同样的事情,它会打印 4。
所以,这是我的一般想法:
取一个 8 位值“34h”,将其移动到 AH 和 AL 中。在 AH 中,使用以下命令清除后半部分:
and ah, 11110000b
在 AL 中,使用以下命令清除前半部分:
and al, 00001111b
所以 AH = 0110b 或 3 和 AL = 0100b 或 4,然后相应地打印出来..
这是一个好方法吗?还是我的想法完全不正确或过度思考?
编辑:这是我的最终解决方案,原始值为 12345678h。感谢所有帮助过的人!
;-----------------------------------------------------------------------------
PackedToAsc PROC USES eax ebx edx ecx esi
; This function displays a packed decimal value in its "ascii" form
; i.e. 12345678h would display decimal, 12345678 in decimal form
;
; Requires ECX = SIZEOF packed decimal
; ESI to be pointing to the packed decimal
;-----------------------------------------------------------------------------
mov edx, [esi] ; temp store our offset
mov eax, 0 ; clear eax
mov ebx, 0 ; clear ebx
L1: rol edx, 8 ; rotate left 8 bits to avoid little endian
mov [esi], edx ; mov our temp back to the actual value
mov al, BYTE PTR [esi] ; al = 12h 0001 0010
mov bl, BYTE PTR [esi] ; bl = 12h 0001 0010
shr al, 4 ; al = 0000 0001
and bl, 00001111b; ; bl = 0000 0010
add al, 48 ; convert to ascii
call WriteChar ; display al
mov al, bl
add al, 48 ; convert to ascii
call WriteChar ; display bl
loop L1
call Crlf
ret
PackedToAsc END
磷