gpt4 book ai didi

assembly - AAA 在 8086 指令集中如何工作?

转载 作者:行者123 更新时间:2023-12-03 22:23:15 25 4
gpt4 key购买 nike

有一些关于指令如何工作的算法的信息:

if low nibble of AL > 9 or AF = 1 then:
AL = AL + 6
AH = AH + 1
AF = 1
CF = 1
else
AF = 0
CF = 0
in both cases:
clear the high nibble of AL.

Example:
MOV AX, 15 ; AH = 00, AL = 0Fh
AAA ; AH = 01, AL = 05
RET

但是我面临的问题是当我用 00FF 和 00FA 之类的数字替换上面示例中的 15 时,AH 中的值会增加 02 而不是 01 !

为什么会有这些变化??

最佳答案

这里是的详细解释DAA 和 AAA :

aaa(加法后的 ASCII 调整)和 daa(加法的十进制调整)指令支持 BCD 算法。 BCD 值是以二进制形式编码的十进制整数,每半字节一位十进制数字 (0..9)。 ASCII(数字)值每个字节包含一个十进制数字,即 H.O.字节的半字节应包含零。

aaa 和 daa 指令修改二进制加法的结果,以针对 ASCII 或十进制算术对其进行校正。例如,要添加两个 BCD 值,您可以将它们添加为二进制数,然后执行 daa 指令以更正结果。同样,您可以在执行 add 指令后使用 aaa 指令调整 ASCII 加法的结果。请注意,这两条指令假定加操作数是正确的十进制或 ASCII 值。如果您将二进制(非十进制或非 ASCII)值相加并尝试使用这些指令调整它们,您将不会产生正确的结果。

选择名称“ASCII 算术”是不幸的,因为这些值不是真正的 ASCII 字符。像“unpacked BCD”这样的名字会更合适。但是,英特尔使用名称 ASCII,因此本文也将这样做以避免混淆。但是,您经常会听到术语“未打包的 BCD”来描述这种数据类型。

Aaa(通常在 add、adc 或 xadd 指令之后执行)检查 al 中的值是否存在 BCD 溢出。它根据以下基本算法工作:

if ( (al and 0Fh) > 9 or (AuxC =1) ) then

if (8088 or 8086) then
al := al + 6
else
ax := ax + 6
endif

ah := ah + 1
AuxC := 1 ;Set auxilliary carry
Carry := 1 ; and carry flags.

else

AuxC := 0 ;Clear auxilliary carry
Carry := 0 ; and carry flags.
endif
al := al and 0Fh

aaa 指令主要用于添加数字串,其中一串数字中的每个字节恰好有一个十进制数字。此文本不会处理 BCD 或 ASCII 数字字符串,因此您现在可以放心地忽略此指令。当然,您可以在需要使用上述算法的任何时候使用 aaa 指令,但这可能是一种罕见的情况。

daa 指令的功能类似于 aaa,但它处理打包的 BCD(二进制代码十进制)值,而不是 aaa 处理的每字节解包值一位。至于aaa,daa的主要目的是添加一串BCD数字(每字节两个数字)。 daa的算法是
if ( (AL and 0Fh) > 9 or (AuxC = 1)) then

al := al + 6
AuxC := 1 ;Set Auxilliary carry.

endif
if ( (al > 9Fh) or (Carry = 1)) then

al := al + 60h
Carry := 1; ;Set carry flag.

endif

因此 AAA 仅适用于每字节一个十进制数字的情况,这与您上面提到的情况不同。

关于assembly - AAA 在 8086 指令集中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18945247/

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