装配中的子指令以及对CF和AF的影响

时间:2015-10-14 16:56:52

标签: assembly subtraction

使用sub命令时, CF (进位标志)和 AF (辅助标志)似乎很棘手。例如(第一种情况正确且易于理解):

 AL=4CH, BL=29H          (C>9 , 4>2)
 SUB AL,BL     ; AL=23H       CF=0   AF=0

 AL=44H, BL=29H          (4<9 , 4>2)
 SUB AL,BL     ; AL=1BH       CF=0   AF=1

 AL=1CH, BL=29H          (c>9 , 1<2)
 SUB AL,BL     ; AL=F3H       CF=1   AF=0   ALSO SF=1

 AL=13H, BL=29H          (3<9 , 1<2)
 SUB AL,BL     ; AL=F3H       CF=1   AF=1   ALSO SF=1

现在再看第二个案例

 0100 0100
 0010 1001 -
------------
 0001 1011

没有从AH到AL的借款。那么为什么第二种情况导致AF = 1?

关于第三种情况,我们从AH借款。所以在我看来,CF = 0和AF = 1。但结果与我的理解不同。为什么呢?

1 个答案:

答案 0 :(得分:1)

英特尔开发人员手册提供了对AF标志的一些见解。它是&#34;辅助携带,&#34;用于BCD算术。手册说明了这一点:

  

AF - 辅助进位标志 - 设置算术运算是否产生进位或借位   3结果;否则清除。该标志用于二进制编码的十进制(BCD)算法。

因此,在您的示例中,没有从AHAL借用,但 AL中的低4位半字节借用AL中的高4位半字节:

0100 0100
0010 1001 -
------------
0001 1011
     ^
     Borrow needed in low nibble because '1001' (9) is greater than '0100' (4)

除非您使用BCD算法,否则您不必使用AF标记。

另一方面,如果从结果的最高有效位进位进位或借位,

CF将被置位,无论指令是使用8位,16位还是32位操作数。

英特尔开发人员手册说明CF

  

CF - 进位标志 - 设置算术运算是否产生最重要的进位或借位   一点结果;否则清除。该标志表示溢出条件   无符号整数运算。它也用于多精度算术。