什么是汇编cmp指令完全比较?

时间:2016-03-31 11:59:20

标签: assembly gdb x86-64

我正在学习汇编语言并遇到了一个我甚至不知道如何问Google的问题。我使用gdb来调试简单的c程序。

我有以下代码:

cmp    eax,DWORD PTR [rbp-0xc]
jle    0x400cc2

打破cmp指令,我正在检查比较的值:

p/d $eax // 1000
x/d $rbp-0xc //-24

所以我认为,跳跃不会发生。但是在进入下一步之后 - 我可以看到ZF标志已设置。 有人可以用简单的语言解释一下吗?

1 个答案:

答案 0 :(得分:4)

您似乎已经做好了一切,除了您没有提供MCVE并且没有显示gdb日志。你不应该设置ZF是正确的。也许你使用了gdb错误。

6           mov dword [rbp-0xc], -24
(gdb) s
7           mov eax, 1000
(gdb)
8           cmp eax, dword [rbp-0xc]
(gdb)
9           jle foo
(gdb) p/d $eax
$1 = 1000
(gdb) x/wd $rbp-0xc
0x7fffffffe254: -24
(gdb) p $eflags
$2 = [ CF PF IF ]

确实,跳跃

由于您坚持要看ZF设置,这可能意味着您的x/d使用字节大小而不是正确的双字。如果你的内存中有1000个看起来像e8 03 00 00,因为x86是小端。如果您只打印最低字节符号,它将显示为-24。使用x/wd强制使用双字大小,否则gdb默认使用最近使用的大小,这可能不合适。