所以我有两个寄存器,eax保存0xDEADC0DE,ebx保存0x1337CA5E。
第一个数字比第二个数字大。但是,在cmp指令:cmp eax, ebx之后,设置了SF (符号标志)。为什么?
为什么如果结果是阳性的(eax - ebx)?
发布于 2017-10-10 12:14:53
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 0123 -> archaic, for BCD only.正如您所看到的,结果是位31集,因此它是负的。
就像-3 -1= -4 (仍然是负的)。
您不能使用SF (符号标志)来确定是否为EBX > EAX。您需要对有符号数字使用OF (溢出标志),对无符号数字使用CF (进位标志)。
阳性或阴性
CPU不知道(或关心)一个数字是正数还是负数。唯一知道的人就是你。如果测试SF和OF,则将数字视为签名。如果您只测试CF,那么您将该数字视为无符号。
为了帮助您,处理器同时跟踪所有标志。您可以决定要测试哪些标志,通过这样做,您可以决定如何解释数字。
https://stackoverflow.com/questions/46665039
复制相似问题