我正在尝试将压缩十进制数转换为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
最佳答案 BCD仅使用0到9的数字.
解压缩的BCD数字使用整个字节的低半字节并将其转换为您添加48的ASCII.
数字34h为小数点后52位,将表示为解压缩的BCD为00000101和00000010(更改以避免在使用内置指令时出现混淆)
打包时:01010010 == BCD打包52
要解压缩它,你可以像你一样做,但是你需要将AH移位以将值放在低位.要转换为ASCII,只需添加48.
[编辑]
在80×86处理器上运行的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取决于你想用它做什么.如果要添加,MUL,DIV,SUB,则必须按照这些说明的要求显示值.还要记住在数字的开头和结尾添加零字节来保存数据.