谁都不能阻挡你成为更优秀的人。
多说一句,本篇文章可能更适合于有函数栈帧基础的朋友,因为文字解释较少,但是图非常好看懂,所以强烈推荐把栈帧开辟的那几张图看一下,可以知道栈帧的形成,当然如果本篇文章不太懂的可以去点我看前面更详细的栈帧详解哈!
函数栈帧
样例代码:
#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. 函数调用,因拷贝所形成的临时变量,变量和变量之间的位置关系是有规律的
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!!