前言: 栈帧 EBP,与ESP不同,其主要是定位函数中的 传入参数,返回地址和局部变量的,下面我们通过调试该程序来看看栈帧有什么作用。
代码:
#include "stdio.h"
long add(long a, long b)
{
long x = a, y = b;
return (x + y);
}
int main(int argc, char* argv[])
{
long a = 1, b = 2;
printf("hello world!\n");
printf("%d\n", add(a, b));
return 0;
}
-
分析 main 函数 开始处的代码:
push ebp
: 即将旧的ebp保存在栈中
mov ebp,esp
: 将新的ebp指向该处
sub ebp,esp
: 开辟新的栈空间方便以后存储局部变量
push ebx
:保存旧的寄存器其return 处也是,先释放保存的寄存器,然后在释放栈中的空间
-
分析调用add( ) 前的操作
- 先修改栈显示方式,因为往往局部变量以栈针形式,即 [ebp-x] 的形式显示出来
- 分析代码:
- 先修改栈显示方式,因为往往局部变量以栈针形式,即 [ebp-x] 的形式显示出来
-
分析 add() 函数之后的操作:看注释,前面我们已经分析过了
-
总结:对一个函数来讲,其有效的栈如下图: