栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言详解函数栈帧的创建与销毁

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言详解函数栈帧的创建与销毁

目录

一、什么是函数栈帧?

二、函数栈帧储存在哪?

三、详解函数栈帧的创建与销毁


一、什么是函数栈帧?

      C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。(每一个函数调用,都要在栈上创建一个空间。)

二、函数栈帧储存在哪?

(一)函数栈帧的创建是在寄存器(CPU的一部分)中实现的。

基础的寄存器大体作用有:

①清除数码:将寄存器里的原有数码清除。 

②接收数码:在接收脉冲作用下,将外输入数码存入寄存器中。  

③存储数码:在没有新的写入脉冲来之前,寄存器能保存原有数码不变。

④输出数码:在输出脉冲作用下,才通过电路输出数码。

       常见的寄存器类型有eax、ebx、ecx、edx、ebp、esp。其中今天我们着重谈一谈ebp和esp两种寄存器。(下列具体说明)

ps:ebp和esp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。(记住!!)

(二)认识相关寄存器
相关寄存器:

eax:通用寄存器,保留临时数据,常用于返回值
ebx:通用寄存器,保留临时数据
ebp:栈底寄存器
esp:栈顶寄存器
eip:指令寄存器,保存当前指令的下一条指令的地址

 

三、详解函数栈帧的创建与销毁

这里我们借用自己的add函数详细讲解

1、几个事前了解的知识,

回顾:mov:数据转移指令
push:数据入栈,同时esp栈顶寄存器也要发生改变,也叫压栈
pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变,也叫出栈
sub:减法命令
add:加法命令
call:函数调用,1. 压入返回地址 2. 转入目标函数
jump:通过修改eip,转入目标函数,进行调用
ret:恢复返回地址,压入eip,类似pop eip命令

我们要学会转反汇编和打开调用堆栈的窗口如下图

以便读者们更好地分析(建议vs2013以下)

vs2013中main函数是被___tmainCRTStartup调用的,而___tmainCRTStartup是被mainCRTStartup调用的,push是压栈

 

2、开始逐层看:先发现ebp地址低了,也就是ebp重新压栈了,ebp可以画上去,也就是ebp地址变低了

然后esp地址也减去一个值,也往上了,地址变小了

然后由ebp和esp新确立的一块空间就是为main函数开辟的空间,如下

这里ebp和esp位移之后,重新为main开辟了空间

  再继续往下走、

三个push压栈,这里

这三个就是用来加载有效地址的

接下来,从edi向下的39h的空间全部改成0CCCCCCCCh的内容

继续往下看、

这几句话也就是把main函数中a,b等初始值放进去刚刚开辟的CCCCCCCCC空间里,如下,a,b之间会空着两格(其他编译器也可能不空,取决于编译器)

继续按照汇编指令往下走,要调用add函数喽

 可以看到,把b(ebp-14h指的是b)压在了eax了,把a压在了(ebp-8指的是a)ecx了,这两步动作就是在传参!

接下来call指令是调用函数,执行call指令后,下一条指令在栈顶压了值进去,接下来你会发现 他仿佛咋重复main函数前的操作,如下,其实在为add函数准备栈帧

 

 push在栈顶压上了ebp,然后把esp赋给ebp,sub为减,esp被减后开辟空间也就是add函数的栈帧,

然后重复了之前的过程ebx、esi、edi压栈后在刚刚空间中赋了cc cc cc cc的内容(初始化),然后终于执行函数内容了

 然后ebp+8找到了传参的ecx、eax的空间里的值,然后加起来取和即为z,以上过程看下图

 想必大家都听过形参是实参的一份临时拷贝,上面正是最好的说明!

z的结果出来,接下来该往回返了

 z的值30放在了eax寄存器中,接下来三个pop(弹出),弹出后esp往下走,然后ebp赋给esp和pop  ebp,回到了main函数里面esp回到了00C21450(也弹出了)下的位置,ebp回到最初的位置。

然后,esp回到了esi位置,形参的空间销毁了。

c的值是eax寄存器中之前存放的z的值,也就把返回值带回来了!

整体的流程图解都在下面图片上

 认真阅读加实践你就会深刻地明白函数栈帧的创建与销毁,并且深刻了解局部变量,实参形参关系,函数如何传参,函数结果如何返回等有着深刻了解。

 可以自己带着反汇编代码慢慢看,建议自己实践哦!!

祝你学业有成!


 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862296.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号