浅谈栈帧
来源:互联网 发布:三千元手机推荐知乎 编辑:程序博客网 时间:2024/05/16 12:28
小白的文章:
1.什么事栈帧?
这里引用百度的定义:
1.C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
2.栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。
3.从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里。
由此我们可以知道栈帧就是一个函数调用过程中为其开辟栈空间来在此次调用中来存储参数,变量的,我们称这块空间叫做栈帧。
下面通过一段简单的代码来阐述问题:
#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 z = 0; z = Add(a,b); printf("z=%d\n"); return 0;}
下面是main函数栈帧的创建的过程:
说明:首先将ebp压入栈,将esp赋值给ebp,开辟一个0E4h(vs环境)的空间,产生新的esp,后面就push 三个空间,将新开辟的空间初始化0CCCCCCCCh,在从ebp向后使用创建局部变量a,b。这里忘了把z=0画出来了。
下面是Add函数调用:
说明:首先将形参b中再将a压入,然后进行call指令,指令调用时要先将call下一跳指令的地址压栈,然后再调到add函数。
下面进入Add函数里面:
说明:这里和main函数栈帧一样都要经过将esp赋值给ebp,在新开辟0CCh大小的空间,压入三个空间为ebx esi edi,初始化剩下的空间,创建变量,将形参相加的结果赋值到z中存在寄存器中,带回返回值。
下面是返回部分:
说明:返回时esp赋值成ebp,弹出ebp,执行ret指令,将此时的ebp—main弹出并将程序执行到main的ebp处。
下面是整个过程的图示:
如有错误,欢迎指出。
阅读全文
0 0
- 浅谈栈帧
- 浅谈栈帧
- 浅谈栈帧
- 浅谈栈帧
- 浅谈栈帧
- 浅谈栈帧(一)
- 浅谈栈帧(二)
- 浅谈main函数的栈帧
- 浅谈对栈帧的理解
- 浅谈以太网帧格式
- 浅谈以太网帧格式
- 浅谈以太网帧格式
- 浅谈以太网帧格式
- 帧中继原理浅谈
- 浅谈栈和队列
- 浅谈堆和栈
- 浅谈栈与递归
- 浅谈堆与栈
- 一个用于 Qt 项目的简单的日志库
- ZOJ 3804 YY's Minions(搜索+模拟)
- 4、C程序 数组排序之[选择排序法]
- 数据结构-最小完美哈希和保序最小完美哈希函数
- 防止过拟合的方法
- 浅谈栈帧
- nginx(负载均衡基本配置)
- 用maven命令在命令行中create创建项目出现错误
- BlockingQueue深入分析
- HTML5
- MD5加密介绍
- CTR预估
- 阿里云服务器配置开发环境第四章:Centos7.3安装Maven以及环境配置
- Spring MVC的几个注解