栈帧

来源:互联网 发布:怎么在mac上新建文件夹 编辑:程序博客网 时间:2024/06/15 04:44

相关名词
函数栈帧
函数调用过程要为函数开辟栈空间, 用于本次函数的调用中临时变量的保存、 现场保护。 这块栈空间我们称之为函数栈帧。
栈的空间是由高地址低地址使用的。
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函数空间彻底返还。
整体过程图
这里写图片描述

原创粉丝点击