2012-01-23 25 views
8

我正試圖在x86中進行溢出&進位標誌。在x86中的進位/溢出和減法

據我瞭解,對於除了符號2支的補數的,只能以四種方式之一產生的標誌(我的例子是4位數字):

  1. POS + POS = NEG(溢出)
    • 0111 + 0001 = 1000(7 + 1 = -8)
  2. POS NEG + = POS(進位)
    • 0011 + 1110 = 0001(3 + -2 = 1)
  3. NEG NEG + = NEG(進位)
    • 1111 + 1111 = 1110(-1 + -1 = -2)
  4. NEG NEG + = POS(溢出&進位)
    • 1000 + 1001 = 0001(-8 + -7 = 1)

所以,在x86彙編,d o從A中分解B生成與添加A和-B相同的標誌?

+0

參見[理解與進位溢出條件/標誌有符號與無符號](http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt),而在其他環節[x86標記wiki](https://stackoverflow.com/tags/x86/info)。 –

回答

16

這裏有一個可能有幫助的參考表。這顯示了的一個示例,每個可能是由x86上的ADD和SUB指令產生的4個算術標誌的組合。 'h''ud'和'd'代表每個值的十六進制,無符號十進制和帶符號的十進制表示。例如,SUB的第一行表示0xFF - 0xFE = 0x1,沒有設置標誌。

但是,我認爲小故事是Alex的答案是正確的。

ADD 
     A     B     A + B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d | OF | SF | ZF | CF 
---+------+-------+----+------+-------+----+------+-------+----+----+----+--- 
7F | 127 | 127 | 0 | 0 | 0 | 7F | 127 | 127 | 0 | 0 | 0 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 7E | 126 | 126 | 0 | 0 | 0 | 1 
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 
FF | 255 | -1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 
FF | 255 | -1 | 0 | 0 | 0 | FF | 255 | -1 | 0 | 1 | 0 | 0 
FF | 255 | -1 | FF | 255 | -1 | FE | 254 | -2 | 0 | 1 | 0 | 1 
FF | 255 | -1 | 80 | 128 | -128 | 7F | 127 | 127 | 1 | 0 | 0 | 1 
80 | 128 | -128 | 80 | 128 | -128 | 0 | 0 | 0 | 1 | 0 | 1 | 1 
7F | 127 | 127 | 7F | 127 | 127 | FE | 254 | -2 | 1 | 1 | 0 | 0 


SUB 
     A     B     A - B    Flags 
---------------  ---------------- ---------------  ----------------- 
h | ud | d | h | ud | d | h | ud | d || OF | SF | ZF | CF 
----+------+-------+----+------+-------+----+------+-------++----+----+----+---- 
FF | 255 | -1 | FE | 254 | -2 | 1 | 1 | 1 || 0 | 0 | 0 | 0 
7E | 126 | 126 | FF | 255 | -1 | 7F | 127 | 127 || 0 | 0 | 0 | 1 
FF | 255 | -1 | FF | 255 | -1 | 0 | 0 | 0 || 0 | 0 | 1 | 0 
FF | 255 | -1 | 7F | 127 | 127 | 80 | 128 | -128 || 0 | 1 | 0 | 0 
FE | 254 | -2 | FF | 255 | -1 | FF | 255 | -1 || 0 | 1 | 0 | 1 
FE | 254 | -2 | 7F | 127 | 127 | 7F | 127 | 127 || 1 | 0 | 0 | 0 
7F | 127 | 127 | FF | 255 | -1 | 80 | 128 | -128 || 1 | 1 | 0 | 1 
+0

您的表格很有幫助,但是127 - -1是128而不是-128。 –

+2

@James - 不,引用x86程序員的參考「一個字節整數的整數值範圍從-128到+127」 – srking

+0

好吧,你是對的,但表格很棒。 :) –

6

加法或減法時,進位和溢出值的所有4種組合都是可能的。您可以在this answer中看到更多示例。

This answer包含您從A-B得到的進位與您從A+(-B)得到的進位相反的事實。第一個鏈接的代碼利用此屬性將ADC轉換爲SBB

但是,對於A-BA+(-B),帶符號的溢出標誌值必須相同,因爲它取決於結果是否具有正確的符號位,並且兩種情況下符號位都是相同的。