C语言中的函数调用(栈帧)

本文解释了栈帧的概念及其在函数调用中的作用。详细介绍了栈帧如何存储函数参数、局部变量等信息,并通过一个具体的例子展示了函数调用的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是栈帧?

从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。

首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。

注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;ESP所指的栈帧顶部和系统栈的顶部是同一个位置。 ————百度百科

先识记几个汇编中的寄存器和命令:

1.call命令:将当前正在执行的指令的地址压入栈中,跳转至目标函数的地址进行函数调用

2.ebp:基址寄存器(保存栈底)

3.esp:栈顶寄存器

4.eip:指令寄存器(程序计数器)

5.ret:返回过程调用,弹出栈顶地址,将函数返回地址弹到eip

为方便查看汇编,及监视本次采用vc++6.0编译器

测试源代码如下:

#include <stdio.h>

int myadd(int x, int y)
{
	int z = x+y;
	return z;
}

int main()
{
	int a = 0xaaaaaaaa;
	int b = 0xbbbbbbbb;
	
	int c = myadd(a,b);
	printf("you should run here!");
	return 0;
}

总结:

函数调用可以大致分为以下几个过程:

1.首先,从main函数开始,要展开mian函数的调用,就要先为main函数创建栈帧。

2.调用myaddd函数,这时要为myadd函数创建栈帧,传参时注意参数是从后向前传。(形参实例化)

3.先ret返回myadd函数,然后返回main函数。(返回后栈帧结构释放)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值