栈是如此重要——C函数栈

栈的定义

栈为先进后出的数据结构

在《数据结构》中有C的栈实现算法,然而很少看到对于栈有什么作用的描述。

考虑一个场景,当CPU在计算时需要将某些值临时保存,待当前需要处理的事情处理完毕之后,重新把这些数据还原。此时应该怎样做?典型的应用就是函数调用,比如

int add3(int a, int b, int c){
	return a + b + c;
}

int add2(int a, int b){
	int result = a+b;
	return add3(result, a, b);
}

int main(){
	add2(2,3);
	return 0;
}

在上述程序中,add2会调用add3函数,当调用add3函数前,计算机必须保留下add2函数的位置,以便在add3结束之后可以返回到add2处理的位置。

在这里插入图片描述

此时,栈就起到了记录现场的作用

C语言函数栈

上述的函数调用过程可用下图实现

在这里插入图片描述

在程序进入main函数之后,在内存中划出一片区域,该区域用于保存main的信息。

当main函数调用add2函数时,在main函数的底部处划出一片区域用于add2函数使用,此时可以看出,main函数的信息保存在add2的顶部,当add2执行完毕之后,只需要退回到main函数的起始处即可。

同理,add2调用add3函数时,也是在add2的底部划出一片区域用于add3函数使用,当add3执行完毕,将这部分区域抛弃,回到add2起始处即可。

很明显,上图实现的是一个先进后出结构。在计算机中,栈在许多情况下都用于保存现场信息,理解了栈,就理解了很多计算机的执行过程。典型应用栈除了函数栈之外,还有线程栈,撤销操作,系统调用等。

x86函数栈的汇编实现

首先考虑到栈的定位问题,如何确保不会在栈元素的弹出(pop)过程中不会丢失压栈(push)的元素信息。这里以x86为例进行说明。

在x86中有2个寄存器专门用于记录栈的位置信息。一个是rbp(帧基地址寄存器),一个是rsp(栈顶指针寄存器)。rbp指

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值