【发布时间】:2013-09-22 15:06:48
【问题描述】:
有一些关于该指令如何工作的算法的信息:
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
但我面临的问题是,当我将上面示例中的 15 替换为 00FF 和 00FA 之类的数字时,AH 中的值会增加 02 而不是 01 !!
为什么会有这些变化??
【问题讨论】:
-
您应该在添加后仅使用它。 35 年前使用 BCD 算术是有意义的,那些日子已经一去不复返了。
-
值 00FF 和 00FA 不是 AAA 指令的合法输入。 AL 的最高法定值为 18 小时。
-
我相信 AAA 的目的是一次添加 2 个 BCD 数字(这就是 AF 或半进位的用途),FF 是合法的输入值(例如 99 + 66 的结果)。
-
AAA指令不会添加 BCD 数字,但会在 之后进行任何需要的数字溢出调整。如果您仔细阅读了AAA指令描述,它会说,AAA 指令仅在它遵循添加(二进制加法)两个解压缩 BCD 值并将字节结果存储在 AL 寄存器中的 ADD 指令时才有用。 在您的00FF和00FA示例中,这些数字不能由BCDADD操作生成。