《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1函数栈帧(完结)( C语言从入门到入土(进阶篇)

本文深入探讨C语言中函数栈帧的创建与释放,通过样例代码分析了函数调用时栈帧的形成、寄存器作用、汇编指令的应用。强调了栈帧在函数调用中的重要性,以及其对时间和空间的影响。适合已有一定基础的读者,通过图文并茂的方式理解函数调用的细节。
摘要由CSDN通过智能技术生成

目录

函数栈帧

样例代码:

认识相关寄存器

认识相关汇编命令

讲解思路图

1.main函数也是要被调用的

2.main函数也是要形成栈帧结构的

3. 起步

​4.开始调用

5.形成栈帧

​6.释放栈帧​

​7.释放临时拷贝,彻底释放空间

总结


本章节文章是作者通过观看《C语言深度剖析》等各种资料总结的精华,基础部分省略了不少,是为了让大家能够更加深入了解C语言的魅力!因为为了避免与之前的文章发生赘述,所以就直接讲作者认为的精华部分哈!现在正文开始! 

谁都不能阻挡你成为更优秀的人。 

多说一句,本篇文章可能更适合于有函数栈帧基础的朋友,因为文字解释较少,但是图非常好看懂,所以强烈推荐把栈帧开辟的那几张图看一下,可以知道栈帧的形成,当然如果本篇文章不太懂的可以去点我看前面更详细的栈帧详解哈!

函数栈帧

样例代码:

#include <stdio.h>
#include <windows.h>
int MyAdd(int a, int b)
{
        int c = a + b;
        return c;
}
int main()
{
        int x = 0xA;
        int y = 0xB;
        int z = MyAdd(x, y);
        printf("z = %x\n", z);
        system("pause");
        return 0;
}

认识相关寄存器

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

认识相关汇编命令

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

讲解思路图

备注:

1.main函数也是要被调用的

2.main函数也是要形成栈帧结构的

3. 起步

4.开始调用

5.形成栈帧

6.释放栈帧

7.释放临时拷贝,彻底释放空间

总结

1. 调用函数,需要先形成临时拷贝,形成过程是从右向左的
2. 临时空间的开辟,是在对应函数栈帧内部开辟的
3. 函数调用完毕,栈帧结构被释放掉
4. 临时变量具有临时性的本质:栈帧具有临时性
5. 调用函数是有成本的,成本体现在时间和空间上,本质是形成和释放栈帧有成本
6. 函数调用,因拷贝所形成的临时变量,变量和变量之间的位置关系是有规律的

今天的内容就到这里了哈!!!

要是认为作者有一点帮助你的话!

就来一个点赞加关注吧!!!当然订阅是更是求之不得!

最后的最后谢谢大家的观看!!!

你们的支持是作者写作的最大动力!!!

下期见哈!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来45

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值