函数栈帧的创建和销毁图解
目录
- 一、问题:
- 二、寄存器 栈区
- 1、寄存器有哪些?有什么作用?
- 2、编译环境
- 3、栈区的使用习惯:
- 4、main函数也是被其他函数调用的
- 5、汇编代码
- 三、为main函数创建栈帧
- 1、main函数之前的函数
- 2、压栈push
- 3、为main函数预开辟空间
- 三、准备abc变量
- 四、调用Add函数
- 五、进入函数
- 六、返回
- 七、总结:
- 1、局部变量是怎么创建的:
- 2、为什么局部变量不初始化是随机值:
- 3、函数是怎么传参的,传参的顺序是怎样的:
- 4、形参和实参是什么关系:
- 5、函数调用结束后是怎么返回的:
一、问题:
- 局部变量是怎么创建的:
- 为什么局部变量不初始化是随机值:
- 函数是怎么传参的,传参的顺序是怎样的:
- 形参和实参是什么关系:
- 函数调用结束后是怎么返回的:
- 返回值如何带回:
二、寄存器 栈区
1、寄存器有哪些?有什么作用?
eax
ebx
ecx
edx
ebp
esp
ebp和esp这2个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。
2、编译环境
越高级的编译器函数栈帧的封装越不容易看,这里的代码是用VS2013写的
//测试代码
int Add(int x, int y)
{int z = 0;z = x + y;return z;
}int main()
{int a = 10;int b = 20;int c = 0;c = Add(a, b);printf("%d\n", c);return 0;
}
3、栈区的使用习惯:
先使用高地址空间再使用低地址空间,高地址空间使用完再使用低地址的空间。
所以esp称为栈顶指针,ebp称为栈底指针
4、main函数也是被其他函数调用的
5、汇编代码
三、为main函数创建栈帧
1、main函数之前的函数
2、压栈push
3、为main函数预开辟空间
三、准备abc变量
四、调用Add函数
五、进入函数
六、返回
七、总结:
1、局部变量是怎么创建的:
为函数分配好栈帧空间,栈帧空间里初始了部分空间,局部变量在栈帧里分配一些空间
2、为什么局部变量不初始化是随机值:
因为是我们初始化时放进去的,如果不对局部变量进行初始化,就是CCCCCCCC,也就是我们看见的随机值。
3、函数是怎么传参的,传参的顺序是怎样的:
还没有传参的时候,已经push从右向左开始压栈,把两个参数压进去了,
4、形参和实参是什么关系:
形参是我们压栈的时候开辟的空间,形参是实参的一份临时拷贝,他们的空间是独立的,改变形参不会影响实参。
5、函数调用结束后是怎么返回的:
在调用函数之前我们就把call指令的下一条指令压进去了,把ebp调用这个函数的上一个函数的栈帧ebp地址记住了,当我们要返回函数的时候,弹出ebp,就能找到上一个函数调用的ebp,指针往下走的时候,就能够找到esp的顶部,回到栈帧空间。
记住了call指令的下一条指令的地址,返回的时候,就能跳转到call指令的下一条指令的地址,这样就能返回函数。
函数栈帧的创建和销毁图解相关推荐
- 函数调用过程详解:函数栈帧的创建与销毁
前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...
- (动图详解)汇编视角观察函数栈帧的创建和销毁
目录 1.阅读本文的价值 2.函数栈帧及栈的概念 3.部分寄存器及汇编指令 4.main函数的调用 5.main函数的栈帧创建 6.变量的栈帧创建 6.函数传参 7.函数内部运算及销毁 ...
- 函数栈帧的创建与销毁
目录 前言 一.预备知识 1.内存区域的划分和分配 2.栈帧简介 3.寄存器简介 二.函数栈帧介绍 1.源代码 2.如何查看汇编代码 3.函数栈帧的创建与销毁(重点) 三.小彩蛋 总结 前言 最近在学 ...
- 程序员内功心法之函数栈帧的创建和销毁
目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3). ...
- 【C语言】程序员筑基功法——《函数栈帧的创建与销毁》
<函数栈帧的创建与销毁> 文章目录 1. 前言 2. 问题引入 3. 前提准备 3.1 寄存器 3.2 汇编指令 4. 函数栈帧的维护 5. 如何调用堆栈 6. 函数栈帧的创建和销毁 6. ...
- C语言内功修炼之函数栈帧的创建与销毁(举例加图解)
大家可能会函数栈帧不了解,可能都没有听过这个,不用着急,在理解函数栈帧之前,我们先来了解一下程序对内存使用的分区大概情况: 区域 作用 栈区(stack) 由编译器自动分配和释放,存放函数的参数值, ...
- 程序员内功修炼——函数栈帧的创建与销毁
一.什么是函数的栈帧 c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关. 函数栈帧:就是函数调用过程中程序的调用栈所开辟的空间,这些空间用来存放: 1 ...
- 内功修炼《函数栈帧的创建和销毁》建议收藏
文章目录 前言 一. 寄存器的概念 二. 通用寄存器的结构 三. 指针寄存器和变址寄存器 四. EBP和ESP 五.总结 前言 在前期的学习过程中,我们可能会有很多的困惑: 1️⃣ 局部变量是怎么创建 ...
- 一文带你深入了解函数栈帧的创建和销毁
作者介绍:友友们好我是沐曦希,可以叫我小沐
最新文章
- 手把手教你Android Studio的安装与配置
- css -- 两种方法实现流式布局
- python变量使用前必须先声明、并且一旦声明_初学者学习Python的30天-第18天-文件处理...
- linux ssh连接交换机_访问SMB交换机CLI使用SSH或远程登录
- Spring Boot整合Redis——自定义RedisSerializer
- python3 x和python2 x区别_Python3.x和Python2.x的区别(转存参考)
- 做餐饮服务员有前途吗
- jmeter 连接 sqlite 进行压力测试
- iostream stdlib fstream io.h 头文件的作用
- matlab生成正交试验,正交表的构造方法及Matlab实现.pdf
- 常用的20个js简洁代码
- win10街头篮球服务器维护中,win10系统玩街头篮球游戏延迟不顺畅的处理技巧
- 写好作文批语,激发学生的写作兴趣
- 使用腾讯tapd工具,进行创建迭代任务、任务拆解、、制定整体发布计划、多维度甘特图进度把控
- 路由器桥接:老式路由器桥接隐藏网络并开启无线隐藏网络
- EXCEL如何使用查找函数vlookup
- 产业分析:股权激励市场实践
- 使用左氧氟沙星4注意
- butter中文意思_butterfly是什么意思_butterfly的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 手机网站常用的推广方式有哪些