我想将包装的十进制数字转换为ascii字符串。这是我的理解迄今:包装十进制到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
该方法看起来没问题。当涉及到组装级代码时,手头没有多少选择。 – 2010-11-09 07:39:42
@Gunner:不,它不是。他在做的是操纵数字,而不是打包和解开二进制编码的小数。 – slashmais 2010-11-09 08:11:11