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

时间:2014-03-13 13:51:23

标签: 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)中,如何显示值 有点像地方&#39; ? 我尝试使用(gdb) p -0x8(%rbp),但得到这个:

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

3 个答案:

答案 0 :(得分:3)

gdb中的注册表可以使用前缀&#39; $&#39;

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

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

答案 1 :(得分:2)

这意味着&#34;从rbp&#34;中存储的地址中减去8时存储的数据。尝试查看gdb中可用的堆栈命令:http://www.delorie.com/gnu/docs/gdb/gdb_41.html

答案 2 :(得分:2)

-0x8(%rbp)等结构的实际含义取决于体系结构(或汇编语言)。但在这种情况下,-0x8(%rbp)是一个内存地址,可能是%rbp减去8的值。

在gdb中,您可以通过执行类似

的操作来打印这些内存地址的值
info r rbp
p *(int *)(value_of_rbp - 8)