所以我有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. –