函数栈帧的创建和销毁
一. 困惑
前期学习的时候,我们可能会有很多困惑?
比如:
二. 详解
- 寄存器
要理解函数栈帧,就要理解ebp和esp寄存器
ebp,esp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。
- 图解
- 细节探讨
(暂时没空,有空再更新)
三. 解惑
局部变量是怎么创建的?
先为函数分配好栈帧空间,初始化好之后,再为局部变量分配一些空间。
如图:
为什么局部变量的值是随机值?
因为局部变量在声明时并没有被初始化,值是随机放进去的。
如图:
函数是怎么传参的?传参的顺序是怎样的?
当我们还没有调用的时候,就通过push从右向左把参数压栈。在进入函数后,通过指针偏移量,找到形参。
如图:
形参和实参是什么关系?
形参是实参的一份拷贝,值是相同的,地址不同。
函数调用是结束后怎么返回的?
在调用之前,就把call指令下一条指令的地址压栈,当函数要返回的时候弹出ebp就能够找到原始上一个函数调用的ebp,然后指针往下走就能找到esp的地址回到栈帧空间。返回值通过寄存器带出来
本篇博客为本人学习C语言时的详细笔记,如有错误之处,还望各位指正。
文章为原创,如要转载请注明出处