使用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。但结果与我的理解不同。为什么呢?
答案 0 :(得分:1)
英特尔开发人员手册提供了对AF
标志的一些见解。它是&#34;辅助携带,&#34;用于BCD算术。手册说明了这一点:
AF - 辅助进位标志 - 设置算术运算是否产生进位或借位 3结果;否则清除。该标志用于二进制编码的十进制(BCD)算法。
因此,在您的示例中,没有从AH
向AL
借用,但 从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 - 进位标志 - 设置算术运算是否产生最重要的进位或借位 一点结果;否则清除。该标志表示溢出条件 无符号整数运算。它也用于多精度算术。