2015-10-14 79 views
0

看起来CF(进位标志)和AF(辅助标志)在使用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借款人那么为什么第二种情况导致AF = 1?

关于第3个案子,从AH借。所以在我看来,CF = 0和AF = 1。但结果与我所了解的不同。为什么?

回答

1

Intel开发人员手册AF标志提供了一些见解。它是用于BCD算术的“辅助进位”。手册中提到:

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

在你的榜样

因此,不存在借款从AHAL,但有是低4位半字节借款AL高4位半字节AL

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

除非您使用BCD算术,否则不应使用AF标志。

另一方面,如果结果的最高有效位存在进位或借位,则指令是否使用8,16或32位操作数。

英特尔开发者手册说,大约CF

CF - 进位标志 - 如果算术运算,产生进位或借出最显著 位结果的;否则清除。该标志表示 无符号整数运算的溢出条件。它也用于多精度算术。

+0

所以AF用于4位。 CF用于8位。关于16位呢?我的意思是AX携带。如何区分8位和16位进位? – mahmood