繁体   English   中英

为什么mov指令执行不正确?

[英]Why the mov instruction isn't executed correctly?

调试程序时遇到错误,即使阅读了asm代码也无法解决 图片

这是来自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);
}

p/x $rdx显示0x61b130没有任何意义。 显示的功能项的值的栈帧件事value相匹配你的记忆看到x的商店。

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

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


将所有3个arg溢出/重新加载到堆栈中/从堆栈中重新加载之后,它最终对TAB_enter进行函数调用,其中前3个args相同,而第4个arg = 2rd arg(C语言中的sym

也许没有第四个参数,它只是使用%rcx作为临时文件,而不是像%rax一样直接加载到%rsi

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

TL:DR:毫不奇怪,您显示的asm完全实现了为void S_enter(S_table t, S_symbol sym, void *value)显示的源,不多也不少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM