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

简介: 《C语言深度剖析》第六章 函数栈帧与可变参数列表 p1函数栈帧(完结)( 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命令


讲解思路图

备注:


image.png


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


image.png


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


image.png



3. 起步


image.png


image.png


4.开始调用


image.png


5.形成栈帧


image.png


6.释放栈帧


image.png


image.png


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


image.png


总结

1. 调用函数,需要先形成临时拷贝,形成过程是从右向左的

2. 临时空间的开辟,是在对应函数栈帧内部开辟的

3. 函数调用完毕,栈帧结构被释放掉

4. 临时变量具有临时性的本质:栈帧具有临时性

5. 调用函数是有成本的,成本体现在时间和空间上,本质是形成和释放栈帧有成本

6. 函数调用,因拷贝所形成的临时变量,变量和变量之间的位置关系是有规律的



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

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

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

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

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

下期见哈!!!

相关文章
|
6月前
|
存储 安全 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
|
6月前
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
|
1月前
|
C语言
【C语言的完结】:最后的测试题
【C语言的完结】:最后的测试题
19 3
|
6月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
91 5
|
3月前
|
存储 C语言
【C语言】——函数栈帧的创建与销毁
【C语言】——函数栈帧的创建与销毁
|
6月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(中)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
58 2
|
6月前
|
算法 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(上)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
41 1
|
6月前
|
编译器 C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(上)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
44 1
|
6月前
|
Java 编译器 C语言
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(下)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
30 0
|
6月前
|
C语言 C++
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象(中)
从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象
44 0