函数栈帧的创建和销毁





一. 困惑

前期学习的时候,我们可能会有很多困惑?

比如:


二. 详解

  1. 寄存器
    要理解函数栈帧,就要理解ebp和esp寄存器
    ebp,esp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。


  1. 图解

函数栈帧的创建和销毁-LMLPHP


函数栈帧的创建和销毁-LMLPHP


  1. 细节探讨
    (暂时没空,有空再更新)


三. 解惑

局部变量是怎么创建的?

先为函数分配好栈帧空间,初始化好之后,再为局部变量分配一些空间。

如图:

函数栈帧的创建和销毁-LMLPHP


为什么局部变量的值是随机值?

因为局部变量在声明时并没有被初始化,值是随机放进去的。
如图:

函数栈帧的创建和销毁-LMLPHP


函数是怎么传参的?传参的顺序是怎样的?

当我们还没有调用的时候,就通过push从右向左把参数压栈。在进入函数后,通过指针偏移量,找到形参。

如图:

函数栈帧的创建和销毁-LMLPHP


形参和实参是什么关系?

形参是实参的一份拷贝,值是相同的,地址不同。


函数调用是结束后怎么返回的?

在调用之前,就把call指令下一条指令的地址压栈,当函数要返回的时候弹出ebp就能够找到原始上一个函数调用的ebp,然后指针往下走就能找到esp的地址回到栈帧空间。返回值通过寄存器带出来



本篇博客为本人学习C语言时的详细笔记,如有错误之处,还望各位指正。
文章为原创,如要转载请注明出处

08-30 08:52