Assembly 汇编cmp指令究竟是什么?

Assembly 汇编cmp指令究竟是什么?,assembly,gdb,x86-64,Assembly,Gdb,X86 64,我正在学习汇编语言,遇到了一个我甚至不知道如何问谷歌的问题。我正在使用gdb调试简单的c程序 我有以下代码: cmp eax,DWORD PTR [rbp-0xc] jle 0x400cc2 破坏cmp指令,我正在检查值以进行比较: p/d $eax // 1000 x/d $rbp-0xc //-24 所以我假设,跳跃不会发生。但是在进入下一步之后,我可以看到ZF标志被设置了。 有人能用简单的话解释一下吗?除了没有提供MCVE和没有显示gdb日志之外,您似乎做的一切都是对的。您

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

我有以下代码:

cmp    eax,DWORD PTR [rbp-0xc]
jle    0x400cc2
破坏cmp指令,我正在检查值以进行比较:

p/d $eax // 1000
x/d $rbp-0xc //-24
所以我假设,跳跃不会发生。但是在进入下一步之后,我可以看到ZF标志被设置了。
有人能用简单的话解释一下吗?

除了没有提供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
使用的是字节大小,而不是正确的dword。如果您的内存中有1000个,看起来像是
e8 03 00
,因为x86是little endian。如果您只打印最低的带符号字节,它将显示为-24。使用
x/wd
强制使用dword大小,否则gdb默认为最近使用的大小,这可能不合适。

好吧,我很困惑。我试过几次,结果都是一样的。在cmp
$eflags=[IF]
之前,在si命令
$eflags=[PF ZF IF]
之后,用完整的gdb日志编辑您的问题。另外,使用
x/wd
确保打印的是4字节整数。请注意,1000是
e8 03 00
,而-24是
e8 ff ff
,因此如果只打印一个字节,即使1000在内存中,也可能得到-24的结果。Omg,
x/wd$rbp-0xc
打印我1000。现在一切都有意义了。我对gdb不太熟悉,我很难问谷歌这样具体的问题。谢谢