在GDB反汇编中,-0x4(%rbp)是什么意思?

5
我目前在进行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)'.

1
你不应该写成void swap(int *a, int *b)吗?否则,调用者无法反映出变化。 - Aki Suihkonen
你说得没错,但这只是一个演示,我只是想用它来从汇编层面看到更多细节。这样我就能弄清楚为什么我们需要使用指针来改变值了! - Red Wolf's Husband
如果您无法理解AT&T语法或者您不喜欢它,您可以告诉GDB使用Intel的语法。set disassembly-flavor intel - edmz
3个回答

3

在gdb中,寄存器可以通过前缀“$”来引用。

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

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


2

1
链接现在重定向到gnu.org。我不知道这些链接会存在多久,但我找到了一些对那些感兴趣的人有用的链接:https://www.gnu.org/software/hurd/gdb.html和https://sourceware.org/gdb/download/onlinedocs/gdb/index.html。 - harperville

2
那些结构,例如-0x8(%rbp)的实际含义取决于体系结构(或汇编语言)。但在这种情况下,-0x8(%rbp)是一个内存地址,可能是%rbp减去8的值。
在gdb中,您可以通过执行类似以下命令来打印这些内存地址的值:
info r rbp
p *(int *)(value_of_rbp - 8)

太好了!还有一个问题,%edx也代表内存吗? - Red Wolf's Husband
@RedWolf的丈夫 不,%edx 意味着一个名为 edx 的寄存器。例如,mov -0x4(%rbp),%edx 的意思是,我猜测,将地址 %rbp - 4 中的内容移动(实际上是复制)到寄存器 %edx 中。 - Lee Duhem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接