函数调用后堆栈的内容

时间:2018-11-24 18:11:44

标签: c assembly gdb stack cpu-registers

我正在读一本书,该书解释了调用函数时ebpeip寄存器的工作方式。提供了下图:

enter image description here

此处array是局部函数变量。函数参数为ab。实际的C代码是这样的:

#include <stdio.h>

void function(int a, int b)
{
   int array[8];
}

int main()
{
   function(1,2);
   return 0;
}

我用gcc -m32 -g function.c进行编译,并在gdb中运行该程序。命令disas main显示(跳过了几行):

0x08048474 :    push   $0x2
0x08048476 :    push   $0x1
0x08048478 :    call   0x804843b 
0x0804847d :    add    $0x10,%esp

function()的头几条指令是:

0x0804843b :    push   %ebp
0x0804843c :    mov    %esp,%ebp
0x0804843e :    sub    $0x38,%esp
0x08048441 :    mov    %gs:0x14,%eax
0x08048447 :    mov    %eax,-0xc(%ebp)
0x0804844a :    xor    %eax,%eax
0x0804844c :    nop
    ...
0x0804845e :    leave  
0x0804845f :    ret

当我检查ebp的内容时:

(gdb) x/4xw $ebp
0xffffcd48:     0xffffcd68      0x0804847d      0x00000001     0x00000002    

我知道在堆栈中,ebp后应跟返回位置0x0804847d以及函数参数0x000000010x00000002。但是我不知道什么是0xffffcd68。这是ebp的地址吗?

1 个答案:

答案 0 :(得分:1)

它是函数开头的ebp的值。
这是push %ebp的结果,并且x86堆栈是Full Descending。

它是呼叫者框架指针。


请注意,编译器更新其处理堆栈的方式要比书籍作者对其书籍进行更新的频率高。
特别是:对齐,省略帧指针,RVO,隐式参数等可能会使您失望。