装配SF标志

时间:2017-10-10 10:59:04

标签: assembly x86 flags

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

第一个数字大于第二个数字。但是,在cmp指令后cmp eax, ebx设置了SF(符号标记)。为什么?

为什么结果是肯定的(eax - ebx)?

1 个答案:

答案 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不知道(或关心)数字是正数还是负数。唯一知道的人就是你。如果您测试SFOF,则会将该号码视为已签名。如果您只测试CF,则将该号码视为未签名 为了帮助您,处理器立即跟踪所有标志。您决定要测试哪些标志,并通过这样做,您决定如何解释这些数字。