2

当低半字节产生到高半字节的进位时,辅助标志置位。例如:

  1001   9
  1001   9
  ---- ----
1 0010  18

在这种情况下,设置了腋窝进位。

我还听说这个进位用于在 BCD 加法过程中将 0110 添加到低位半字节,以获得正确的 BCD 答案。

但是考虑一下这种情况

1001  9
0011  3
---- ---
1100  12

在这种情况下,该半字节不生成进位,未设置辅助进位,但答案不是正确的 BCD 加法。那么是什么促使处理器纠正答案并得到正确的 BCD 答案呢?

4

2 回答 2

3

DAA(或AAA)的其余语义。完整地说,它们是(对于DAA):

IF 64-Bit Mode
  THEN
    #UD;
  ELSE
    old_AL ← AL;
    old_CF ← CF;
    CF ← 0;
    IF (((AL AND 0FH) > 9) or AF = 1)
      THEN
        AL ← AL + 6;
        CF ← old_CF or (Carry from AL ← AL + 6);
        AF ← 1;
      ELSE
        AF ← 0;
      FI;
    IF ((old_AL > 99H) or (old_CF = 1))
      THEN
        AL ← AL + 60H;
        CF ← 1;
      ELSE
        CF ← 0;
    FI;
FI;

所以你看,不只是 AF 很重要,它还检查数字是否 > 9。

于 2014-01-30T16:05:14.947 回答
1

您必须使用DAAor手动完成AAA。如果 > 9,这将调整当前 nibble 并将 1 添加到更高的 nibble。

于 2014-01-30T16:01:44.033 回答