2011-08-31 64 views
11

我一直在玩組裝一段時間,看一些代碼。 其中AL首先設置爲0x84,然後使用cmp AL,0x30。 該指令然後觸發溢出標誌。爲什麼cmp 0x84,0x30觸發溢出標誌?

從我讀的CMP應該從第一個減去第二個數然後設置標誌,在這種情況下它應該是0x84-0x30結果是0x54並且沒有溢出。

回答

18

這裏只有沒有溢出,如果你解釋這些值作爲無符號數 - 如果你解釋你0x84的簽署,肯定有溢出:

  1. 的0x84解釋爲一個有符號的8位值是-124
  2. 的0x30解釋爲一個符號的8位值是48
  3. -124 - 48 = -172

-172是帶符號的8位值的範圍之外(-128〜127)和T帽子爲什麼OF標誌被設置。你應該檢查CF這表明無符號溢出。

Intel 64 and IA-32 Architectures Software Developer’s Manual,第2卷CMP:

比較是通過從第一操作數中減去所述第二操作數,然後在相同的方式SUB指令設定的狀態標誌來執行。

和SUB:

SUB指令執行整數減法。它評估有符號和無符號整數操作數的結果,並設置OF和CF標誌以分別表示有符號或無符號結果中的溢出。 SF標誌表示簽名結果的符號。

+0

Carl是正確的。 x86溢出標誌實際上意味着*簽名溢出*。 – wallyk

+0

非常好的答案。 – phoxis

+0

非常感謝您的回答! – Maciek