4

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

4

1 回答 1

3

BCD 仅使用数字 0 到 9。
未压缩的 BCD 数字使用整个字节的低半字节并将其转换为 ASCII,您添加 48。
数字 34h 是十进制的 52,将表示为未压缩的 BCD,分别为 00000101 和 00000010
(更改以避免在使用内置指令时混淆)打包时:01010010 == BCD 打包 52

要解压它,您可以像以前那样做,但是您需要将 AH 向右移动以将值放在 lo-nibble 中。要转换为 ASCII,只需添加 48。

[编辑]

在 80x86 处理器上运行的 MASM(=> ALL 指令,包括 Linux)使用 little-endian 方案。摩托罗拉 68000 (Apple Mac) 和 RISC 等 CPU 使用大端序。

当您将数字存储为 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您必须按照这些说明的要求提供值。还要记住在数字的开头和结尾添加零字节来保存进位。

于 2010-11-09T07:41:09.717 回答