所以我有2个寄存器,eax
保存0xDEADC0DE,ebx
保存0x1337CA5E。
第一个数字大于第二个数字。但是,在cmp
指令后cmp eax, ebx
设置了SF
(符号标记)。为什么?
为什么结果是肯定的(eax
- ebx
)?
答案 0 :(得分:4)
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
,则将该号码视为未签名
为了帮助您,处理器立即跟踪所有标志。您决定要测试哪些标志,并通过这样做,您决定如何解释这些数字。