[英]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.