栈帧
程序员文章站
2024-01-01 18:03:40
...
相关名词
函数栈帧
函数调用过程要为函数开辟栈空间, 用于本次函数的调用中临时变量的保存、 现场保护。 这块栈空间我们称之为函数栈帧。
栈的空间是由高地址低地址使用的。
EBP 堆栈基指针
ESP 堆栈顶指针
例用代码
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int ret = Add(a, b) ;
printf("ret = %d\n", ret) ;
return 0;
}
函数的调用先由mainCRTStartup函数开辟空间
反汇编
首先是main函数的调用
通过上面反汇编图可知
1.将ebp压入栈中,方便函数返回之后的现场恢复。
2.esp的值赋给ebp,产生新的ebp。
3.将esp移向低地址,为main函数开辟空间。
4.将ebx,esi,edi依次压入栈中。
5,把栈帧预开辟的空间全部初始化为0cccccccch。
6,接下来处理局部变量a,b的创建,初始化内容。
接下来是Add函数的调用
反汇编
7,所有参数从右到左依次入栈,所以先将b压入栈,然后将b压入栈中。
8,将call指令的下一条指针地址压入栈中。
反汇编
接下来进入Add函数的执行代码处
9.Add函数栈帧和main函数方式一样。
10.创建变量z并初始化。
11.获取形参的a和b相加,把x存入eax,然后eax与y相加存入eax中,最终eax放入z中。
12,将结果存储到eax寄存器,通过寄存器带入函数的返回值。
接下来是函数的返回部分
13,通过三次空间的弹栈,依次取出指令。
14,将ebp赋值esp。
15,出栈,将出栈的内容保存在ebp,回到main函数的栈帧。
反汇编
对空间的释放,返还(局部变量自动创建,函数调用完成后自动销毁)
16,三次依次出栈,将其空间返还。
17,esp指向ebp,对如下空间进行释放。
18,通过ret指令使Add函数空间彻底返还。
整体过程图