我正在尝试将压缩十进制数转换为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
P
答案 0 :(得分:2)
BCD仅使用数字0到9
解压缩的BCD数字使用整个字节的低半字节并将其转换为您添加的ASCII
数字34h为小数点后52位,将表示为解压缩的BCD为00000101和00000010
(更改以避免在使用内置指令时出现混淆)
打包时:01010010 == BCD打包52
要打开包装,您可以按照自己的方式进行操作,但是您需要将AH向右移动以将值放在低位。要转换为ASCII,只需添加48。
[编辑]
在80x86处理器上运行的MASM(=>所有指令,包括Linux)使用little-endian方案。 Motorola 68000(Apple Mac)和RISC等CPU使用big-endian。
当您将数字存储为BCD时,最低有效字节位于最低地址至最高位置,例如:
my_unpacked_bcd DB 4,3,2,1 ; this is the decimal number 1234
my_packed_bcd DW 3412h ; this defines the same number as packed
打包BCD取决于你想用它做什么。如果您想要ADD, MUL, DIV, SUB
,则必须按照这些说明的要求提供值。还要记住在数字的开头和结尾添加零字节来保存数据。