gpt4 book ai didi

assembly - 压缩十进制到 ASCII 汇编

转载 作者:行者123 更新时间:2023-12-02 19:51:33 24 4
gpt4 key购买 nike

我正在尝试将压缩十进制数转换为 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 或 3AL = 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 数字使用整个字节的低半字节,并将其转换为 ASCII,添加 48。
数字 34h 是十进制的 52,将表示为未压缩的 BCD,如 00000101 和 00000010
(已更改以避免使用内置指令时发生混淆)打包时:01010010==BCD打包52

要解压它,您可以按照之前的操作进行操作,但是您需要将 AH 向右移动以将值放入低半字节中。要转换为 ASCII,只需添加 48。

[编辑]

在 80x86 处理器上运行的 MASM(=> 所有指令,包括 Linux)使用小端模式。 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,您必须按照这些指令的要求提供值。另请记住在数字的开头和结尾添加零字节以保存进位。

关于assembly - 压缩十进制到 ASCII 汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4131300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com