压缩十进制到ascii程序集

时间:2010-11-09 07:21:03

标签: assembly decimal ascii masm bcd

我正在尝试将压缩十进制数转换为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 个答案:

答案 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,则必须按照这些说明的要求提供值。还要记住在数字的开头和结尾添加零字节来保存数据。