cmp执行 a sub(但不保留结果)。
让我们手动做同样的事情:
\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 \nRun Code Online (Sandbox Code Playgroud)\n\n标志设置如下:
\n\nOF (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.\nRun Code Online (Sandbox Code Playgroud)\n\n如您所见,结果设置了第 31 位,因此为负值。
\n就像-3 - 1 = -4(仍然是负数)。
\n您不能使用SF(sign flag) 来确定是否EBX > EAX。您需要OF对有符号数使用(溢出标志)或CF对无符号数使用(进位标志)。
正数或负数
\nCPU 不知道(或关心)数字是正数还是负数。唯一知道的人就是你。如果您测试SF和OF,则将该数字视为有符号。如果您只进行测试CF,那么您会将数字视为无符号。
\n为了帮助您,处理器一次跟踪所有标志。您决定要测试哪些标志,并通过这样做来决定如何解释这些数字。