装配SF标志

Laz*_*van 1 x86 assembly flags

所以我有2个寄存器,eax一个保存0xDEADC0DE,ebx另一个保存0x1337CA5E。

第一个数字比第二个数字大。然而,在cmp指令之后:(符号cmp eax, ebx标志SF)被设置。为什么 ?

为什么结果是正(eax- ebx)?

Joh*_*ica 7

cmp执行 a sub(但不保留结果)。

\n\n

让我们手动做同样的事情:

\n\n
 reg     hex value   binary value    \n\n eax = 0xdeadc0de    \xe2\x80\xad11011110101011011100000011011110\xe2\x80\xac\n ebx = 0x1337ca5e    \xe2\x80\xad00010011001101111100101001011110\xe2\x80\xac\n  -    ----------\n res   0xCB75F680    11001011011101011111011010000000 \n
Run Code Online (Sandbox Code Playgroud)\n\n

标志设置如下:

\n\n
OF (overflow) : did bit 31 change      -> no\nSF (sign)     : is bit 31 set          -> yes\nCF (carry)    : is abs(ebx) < abs(eax) -> no  \nZF (zero)     : is result zero         -> no\nPF (parity)   : is parity of LSB even  -> no (archaic)\nAF (Adjust)   : overflow in bits 0123  -> archaic, for BCD only.\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,结果设置了第 31 位,因此为负值。
\n就像-3 - 1 = -4(仍然是负数)。
\n您不能使用SF(sign flag) 来确定是否EBX > EAX。您需要OF对有符号数使用(溢出标志)或CF对无符号数使用(进位标志)。

\n\n

正数或负数
\nCPU 不知道(或关心)数字是正数还是负数。唯一知道的人就是你。如果您测试SFOF,则将该数字视为有符号。如果您只进行测试CF,那么您会将数字视为无符号。
\n为了帮助您,处理器一次跟踪所有标志。您决定要测试哪些标志,并通过这样做来决定如何解释这些数字。

\n