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

标签 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);
}

最佳答案

p/x $rdx 显示 0x61b130 毫无意义。显示 value 的函数入口值的堆栈帧与您在内存中看到的存储后的 x 相匹配。

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

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

<小时/>

将所有 3 个参数溢出/重新加载到堆栈后,最终会对 TAB_enter 进行函数调用,前 3 个参数相同,第 4 个参数 = 第 2 个参数 (sym 在你的 C 源代码中)

或者可能没有第四个参数,它只是使用 %rcx 作为临时参数,而不是直接加载到 %rsi 中,就像使用 % 一样rax.

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

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

关于c - 为什么mov指令不能正确执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486386/

相关文章:

c - 如何从C中的文件中读取 float

c++ - C++程序转C后如何查看(如果有)?

c - ASM 转 C : how to dereference a pointer and add an offset?

performance - 预取指令是否需要在退出之前返回其结果?

assembly - MASM (8086) 汇编语言行延续

c - golang 对共享内存的支持

c - atoi在c程序中的用法

assembly - ARM Neon 汇编器 - 处理溢出寄存器

assembly - Shellcoders手册中的汇编指令不一致

assembly - x86 128 位原子操作