函数栈桢的创建和销毁
❤️ :热爱编程学习,期待一起交流。 🙏:博主是河牧院大一在读学生,水平有限,如发现错误,期待指点!(2466200050)
🌳:以下是我对main函数栈帧的创建与销毁一些拙见,期待大佬们指教。
前言
- 了解函数栈桢的目的是提高我们的基础知识功底,了解反汇编和内存,而不是会printf一个hello world,但不知道他是如何实现的,知其所以然。虽然学了这些并不能提高我们的算法能力,但看看到底是怎么运行的,有助于后期的学习,使我们向看代码是内存这个境界更近一步。
- 正如图上达克效应一样,横坐标代表技术。纵坐标代表自信。我们并没有想象中的那么优秀,要学会从他人眼里看到自己的影子。也许你现在处于愚昧之巅,也许你处在绝望之谷,不过这都是正常的,只要我们认清自己,持续输出,一定会走向开悟之坡。
C语言是由函数构成的
- C语言是由函数为单元模块构成的,不信的话,可以想象一下,每一次我们用C语言编写程序的时候,都需要写一个main()。而main()就是一个函数。
- 就拿最简单的打印一句hello world来说,不就是在main函数里面的的吗。
- 所以我们了解函数栈帧的创建和销毁,其实就在研究一个代码是如何实现的。
- 我们在这里要用到汇编代码来演示函数栈帧的创建与销毁。
栈帧概念
-
C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
-
栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。
-
首先应该明白,栈帧是存放在内存中的栈区的。栈帧是栈区分配给进程的内存区。
-
栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。
寄存器
ebp:栈底指针
esp:栈顶指针
esp和ebp是用来维护函数的。
- 寄存器有很多,