2010-11-09 53 views
4

我想将包装的十进制数字转换为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

+1

该方法看起来没问题。当涉及到组装级代码时,手头没有多少选择。 – 2010-11-09 07:39:42

+0

@Gunner:不,它不是。他在做的是操纵数字,而不是打包和解开二进制编码的小数。 – slashmais 2010-11-09 08:11:11

回答

2

BCD只使用数字0至9,
非压缩BCD数字使用的整个字节的低半字节,并将其转换为ASCII添加48
数34H是52十进制和将被表示为一个压缩BCD为00000101和00000010
(改变使用内置的指令时,以避免混淆) 当包装:01010010 == BCD包装52

要unpac k它,你可以像你做的那样做,但是你需要向右移动以将值放入低位。要转换为ASCII只需添加48

[编辑]

MASM(=>所有指令,Linux的好)上的80x86处理器上运行使用little-endian的方案。诸如摩托罗拉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,则必须按照这些说明的要求提供值。还请记住添加零字节来开始和结束您的数字来保存进位。

+0

好吧,有道理,但现在我来了一个小endian问题。说我有压缩小数.. bcd BYTE 12345678h,如果我做这样的事情... mov al,BYTE PTR bcd,我得到数字78开始,任何建议,以避免这种情况? – 2010-11-09 15:44:41

+0

@Dalton Conley:我已经更新了我的答案,为您提供了更多的指针 – slashmais 2010-11-10 05:01:48

+1

对于小端用户,如果按照传统方法进行解包,打包的BCD 12345678h将为78563412。如果你只是想减少把它存储为一个打包BCD的数字的内存占用量,你的方法是可以的,但是当你想使用它们时你必须记得调整你的值。 – slashmais 2010-11-10 06:17:25