为什么mov指令没有正确执行?

时间:2017-11-25 13:16:26

标签: c assembly x86 gdb x86-64

我在调试程序时遇到了一个错误,即使在读取asm代码后也无法解决问题 image

这里是来自GDB的图像,在0x4070a1之前,%rdx是0x61b130,这个数字应该移到-0x18(%rbp)。但是,在这条指令之后,我发现-0x18(%rbp)变成了0x61b7d0,这让我感到困惑。

由于这个问题,我的程序无法正常运行,有人可以告诉我原因吗?谢谢!

C代码:

E_enventry t = E_FunEntry(level,label,NULL,NULL); //t here is 0x61b130
S_enter(venv,S_Symbol("flush"), t);
......
void S_enter(S_table t, S_symbol sym, void *value) {
    //while value here is 0x61b7d0
    TAB_enter(t,sym,value);
}

1 个答案:

答案 0 :(得分:2)

显示p/x $rdx

0x61b130毫无意义。显示value的函数入口值的堆栈框架事物与商店后面的x内容相匹配。

我认为您的GDB存在问题,但它显示的错误可能是$rdx的价值,因为这与其他两个来源不一致。 (根据你的评论,在溢出/重新加载后也与p/x $rdx不一致。)

尝试使用不同版本的gdb,或尝试使用其他调试器(它也不是GDB的前端)。例如试试lldb

将所有3个args溢出/重新加载到堆栈之后,它最终向TAB_enter调用函数,前3个args相同,第4个arg = 2rd arg(sym在您的C源中)

或者可能没有第4个arg,它只是使用%rcx作为临时代码,而不是直接加载到%rsi,就像使用%rax一样。

gcc -O0非常头脑,只有其中一些是故意的(在C语句之间溢出/重新加载所有内容以支持使用调试器修改内存中的变量,甚至在源代码之间跳转线。)

TL:DR:不出所料,你展示的asm正好实现了你为void S_enter(S_table t, S_symbol sym, void *value)展示的来源,不多也不少。