2017-10-10 79 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