c - -0x4(%rbp) 在 gdb 反汇编中意味着什么?

标签 c gcc gdb disassembly

我目前正在研究 gdb 反汇编,以帮助我了解有关 c 程序的更多细节,因此我编写了一个 c 程序:

#include <stdio.h>

void swap(int a, int b){
        int temp = a;
        a = b;
        b = temp;
}
void main(){
        int a = 1,b = 2;
        swap(a, b);
}

我使用 gdb 并运行 disass/m main 来获取这些:

(gdb) disass /m main
Dump of assembler code for function main:
8   void main(){
   0x0000000000400492 <+0>: push   %rbp
   0x0000000000400493 <+1>: mov    %rsp,%rbp
   0x0000000000400496 <+4>: sub    $0x10,%rsp

9       int a = 1,b = 2;
   0x000000000040049a <+8>: movl   $0x1,-0x8(%rbp)
   0x00000000004004a1 <+15>:    movl   $0x2,-0x4(%rbp)

10      swap(a, b);
   0x00000000004004a8 <+22>:    mov    -0x4(%rbp),%edx
   0x00000000004004ab <+25>:    mov    -0x8(%rbp),%eax
   0x00000000004004ae <+28>:    mov    %edx,%esi
   0x00000000004004b0 <+30>:    mov    %eax,%edi
   0x00000000004004b2 <+32>:    callq  0x400474 <swap>

11  }
   0x00000000004004b7 <+37>:    leaveq 
   0x00000000004004b8 <+38>:    retq   

End of assembler dump.

我的问题是那些 -0x8(%rbp) 是什么意思?

内存还是寄存器?

我知道 1 存储在 -0x8(%rbp) 中,2 存储在 -0x4(%rbp) 中,我如何显示值 那种“地方”? 我尝试使用 (gdb) p -0x8(%rbp) 但得到这个:

A syntax error in expression, near `%rbp)'.

最佳答案

gdb 中的寄存器可以用前缀 '$' 引用

p *(int *)($rbp - 8)

RBP 和 RSP 很可能指的是内存位置,特别是堆栈。其他寄存器或多或少是通用寄存器,也可以指向内存。

关于c - -0x4(%rbp) 在 gdb 反汇编中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22380693/

相关文章:

c - 在C中多次包含静态库

c - 内联汇编的一些 "real-life"用途是什么?

gcc - 我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?

process - 如何知道哪个进程(stat : T) is attached by gdb?

c++ - gdb错误: Couldn't find method (null)what

c - 如何在 Dev C++ 中对齐字符串

c - 找出数字 5 在 0 - 4322 内出现了多少次

c - 短变量转储内部结构不正确

c - 用于编译的 GCC 链接库

c++ - 无法解决 SIGABRT