【C语言】——函数栈帧的创建与销毁

函数栈帧的创建与销毁

本文主要讲解了函数调用过程中其栈帧的创建与销毁,内容干货较多,希望大家认真品味。

使用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中没有体现

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值