2015-10-14 13 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