栈帧
来源:互联网 发布:怎么在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函数空间彻底返还。
整体过程图
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- 栈帧
- eclipset调试1
- 组个最小数
- 非制冷和制冷型红外热像仪的区别
- [坑死老子了]C++ string中的几个小陷阱,你掉进过吗?
- Spring Integration Kafka
- 栈帧
- HDU 3595 博弈论,被支配的恐惧
- 自定义控件---组合控件---标题栏TopBar
- easyui-accordion(手风琴)
- Android 网络编程(二)HttpClient
- Spring Data加JPA (Maven构建Java工程)
- 今年暑假不AC
- JMock实践---(二)返回结果
- 关于最近学习AJAX一些感受