栈的定义
栈为先进后出的数据结构
在《数据结构》中有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指

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



