我正在学习汇编语言并遇到了一个我甚至不知道如何问Google的问题。我使用gdb来调试简单的c程序。
我有以下代码:
cmp eax,DWORD PTR [rbp-0xc]
jle 0x400cc2
打破cmp指令,我正在检查比较的值:
p/d $eax // 1000
x/d $rbp-0xc //-24
所以我认为,跳跃不会发生。但是在进入下一步之后 - 我可以看到ZF标志已设置。 有人可以用简单的语言解释一下吗?
答案 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默认使用最近使用的大小,这可能不合适。