压缩十进制到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

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

点赞