这里有详细的解释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”这样的名称会更合适。然而,Intel 使用名称 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 仅在每个字节只有一位十进制数字的情况下才起作用,这不是您上面提到的情况。