所以我有2個寄存器,eax
其中容納0xDEADC0DE和ebx
其中持有0x1337CA5E。大會SF國旗
第一個數字大於第二個數字。但是,在cmp
指令:cmp eax, ebx
之後SF
(符號標誌)已設置。爲什麼?
爲什麼如果結果是肯定的(eax
- ebx
)?
所以我有2個寄存器,eax
其中容納0xDEADC0DE和ebx
其中持有0x1337CA5E。大會SF國旗
第一個數字大於第二個數字。但是,在cmp
指令:cmp eax, ebx
之後SF
(符號標誌)已設置。爲什麼?
爲什麼如果結果是肯定的(eax
- ebx
)?
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不知道(或護理)的數是正的還是負的。唯一知道的人就是你。如果您測試SF
和OF
,那麼您將該號碼視爲已簽名。如果您只測試CF
,那麼您將該數字視爲未簽名。
爲了幫助您處理器一次跟蹤所有標誌。您決定要測試哪些標誌,並且通過這樣做,您決定如何解釋數字。
'cmp'後面的PF將爲0。 (最低8位是'1000 0000' =甚至沒有設置位= PF = 0) – Ped7g
符號標誌表示結果是* negative,* not * positive。*的確如此,0xdeadc0de - 0x1337ca5e的符號位被設置。你的問題是什麼? – fuz
您在符號比較中使用符號標誌,在這種情況下,0xdeadc0de是一個負數,因此小於第二個操作數(注意您還必須檢查溢出標誌)。對於無符號比較,檢查進位標誌爲零。 – Jester
您可能只是程序集調試器顯示寄存器值的受害者。它始終以十六進制顯示無符號值。但是當你對簽名標誌感興趣時,你必須解釋它的2的補碼編碼值。 0xdeadc0de已打開高位,表示符號的位。因此它是一個負數值,十進制-559038242。 0x1337ca5e沒有設置高位,所以是肯定的。所以肯定,負值始終小於正值,-559038242小於322423390. –