2017-10-10 119 views
-2

所以我有2個寄存器,eax其中容納0xDEADC0DE和ebx其中持有0x1337CA5E。大會SF國旗

第一個數字大於第二個數字。但是,在cmp指令:cmp eax, ebx之後SF(符號標誌)已設置。爲什麼?

爲什麼如果結果是肯定的(eax - ebx)?

+2

符號標誌表示結果是* negative,* not * positive。*的確如此,0xdeadc0de - 0x1337ca5e的符號位被設置。你的問題是什麼? – fuz

+2

您在符號比較中使用符號標誌,在這種情況下,0xdeadc0de是一個負數,因此小於第二個操作數(注意您還必須檢查溢出標誌)。對於無符號比較,檢查進位標誌爲零。 – Jester

+2

您可能只是程序集調試器顯示寄存器值的受害者。它始終以十六進制顯示無符號值。但是當你對簽名標誌感興趣時,你必須解釋它的2的補碼編碼值。 0xdeadc0de已打開高位,表示符號的位。因此它是一個負數值,十進制-559038242。 0x1337ca5e沒有設置高位,所以是肯定的。所以肯定,負值始終小於正值,-559038242小於322423390. –

回答

2

cmp執行sub(但不保留結果)。

讓我們手工做同樣的:

reg  hex value binary value  

eax = 0xdeadc0de ‭11011110101011011100000011011110‬ 
ebx = 0x1337ca5e ‭00010011001101111100101001011110‬ 
    - ---------- 
res 0xCB75F680 11001011011101011111011010000000 

這些標誌設置如下:

OF (overflow) : did bit 31 change  -> no 
SF (sign)  : is bit 31 set   -> yes 
CF (carry) : is abs(ebx) < abs(eax) -> no 
ZF (zero)  : is result zero   -> no 
PF (parity) : is parity of LSB even -> no (archaic) 
AF (Adjust) : overflow in bits-> archaic, for BCD only. 

正如你所看到的,結果有位31集,因此它是負的。
就像-3-1 = -4(仍然是負值)。
您不能使用SF(符號標誌)來確定是否EBX > EAX。您需要對簽名的數字使用OF(溢出標誌),對於無符號數字使用CF(進位標誌)。

正或負
CPU不知道(或護理)的數是正的還是負的。唯一知道的人就是你。如果您測試SFOF,那麼您將該號碼視爲已簽名。如果您只測試CF,那麼您將該數字視爲未簽名。
爲了幫助您處理器一次跟蹤所有標誌。您決定要測試哪些標誌,並且通過這樣做,您決定如何解釋數字。

+0

'cmp'後面的PF將爲0。 (最低8位是'1000 0000' =甚至沒有設置位= PF = 0) – Ped7g