Bootstrap

舍友一把王者的时间我征服了面试官,函数栈帧的创建与销毁

✨✨我们前期学习C语言的时候,可能有很多困惑?😇😇
🌀🌀比如:
😥😥局部变量是怎么创建的?
🌝🌝为什么局部变量的值是随机值?
💫💫函数是怎么传参的?传参的顺序是怎么样的?
🐸🐸形参和实参是什么关系?
🌏🌏函数调用是怎么做的?
😟😟函数调用结束后是怎么返回的?

💝💝知道了函数栈帧的创建和销毁就都会了,其实就是修炼了自己的内功,也能搞懂后期更多的知识。

细节决定成败

🎓🎓进入正题
今天讲解使用的是VS2013,不要使用太高级的编译器,越高级的编译器,越不容易学习和观察。同时在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。

💎1.前言

💍💍1.1虚拟进程地址空间

在这里插入图片描述

🔋🔋1.2.认识相关寄存器及汇编命令

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

在这里插入图片描述
在这里插入图片描述

🎹🎹1.3. 环境设置

在这里插入图片描述
在这里插入图片描述

🎯2.函数栈帧的创建与销毁

📖📖2.1main函数栈帧的开辟

在这里插入图片描述

🎸🎸2.2main函数内局部变量的创建

在这里插入图片描述

🏆🏆2.3add函数传参

在这里插入图片描述

🏄🏄2.4 add 函数调用

在这里插入图片描述

🏀🏀2.5 add函数栈帧开辟

在这里插入图片描述

🎄🎄2.6 add函数传参并进行计算任务

在这里插入图片描述

🎏🎏2.7 返回add函数计算值

在这里插入图片描述

🎒3.结束语

🎃🎃:至此函数栈帧的创建与销毁就讲完了,希望大家不要再有局部变量z出了函数不就销毁了吗?为什么还可以返回计算值的疑惑。🎃🎃
🎐🎐整理不易,希望大家能一键三连支持博主。🎐🎐

;