函数栈帧的创建与销毁
本文主要讲解了函数调用过程中其栈帧的创建与销毁,内容干货较多,希望大家认真品味。
使用C语言进行函数调用时,是否会有很多疑问:
1.局部变量是如何创建的?
2.局部变量在未初始化的情况下,其值为什么会是随机值?
3.函数是如何进行传参的?
4.函数在传参的过程中顺序是怎样的?
5.形参和实参是什么关系?
6.函数调用是如何实现的?
7.函数在调用结束后如何返回的?
这些问题应该都困扰大家许久,本文应该会给大家提供些许思路!
在进行讲解之前,大家应该都会了解C语言的一个关键字register——寄存器: 【关键字】——register在C语言中的使用,寄存器中有eax,ebx,ecx,edx,ebp,esp等。
在函数栈帧中会存在ebp,esp俩个寄存器,这俩个寄存器中存放的是地址,这俩个地址是用来维护函数栈帧的。
每一次的函数调用都会在栈区开创一个空间(包括main函数)。
#include<stdio.h>
int add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main(void)
{
int a = 10;
int b = 20;
int ret = 0;
ret = add(a, b);
return 0;
}
在这里我们使用vs2022来观察函数栈帧的创建与销毁。
同时,本次调试的环境是X86环境
- 将代码转为反汇编
- 打开监视、调用堆栈、内存方便观察
- 转为反汇编
在函数调用开始前,我们应该了解到main函数也是被其他函数调用的,这点在vs2022中没有体现