11
我一直在玩組裝一段時間,看一些代碼。 其中AL首先設置爲0x84,然後使用cmp AL,0x30。 該指令然後觸發溢出標誌。爲什麼cmp 0x84,0x30觸發溢出標誌?
從我讀的CMP應該從第一個減去第二個數然後設置標誌,在這種情況下它應該是0x84-0x30結果是0x54並且沒有溢出。
我一直在玩組裝一段時間,看一些代碼。 其中AL首先設置爲0x84,然後使用cmp AL,0x30。 該指令然後觸發溢出標誌。爲什麼cmp 0x84,0x30觸發溢出標誌?
從我讀的CMP應該從第一個減去第二個數然後設置標誌,在這種情況下它應該是0x84-0x30結果是0x54並且沒有溢出。
這裏只有沒有溢出,如果你解釋這些值作爲無符號數 - 如果你解釋你0x84
的簽署,肯定有溢出:
-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標誌表示簽名結果的符號。
Carl是正確的。 x86溢出標誌實際上意味着*簽名溢出*。 – wallyk
非常好的答案。 – phoxis
非常感謝您的回答! – Maciek