调用栈
功能
调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:
本地变量:子程序的变量可以存入调用栈,这样可以达到不同子程序间变量分离开的作用。
参数传递:如果寄存器不足以容纳子程序的参数,可以在调用栈上存入参数。
环境传递:有些语言(如Pascal与Ada)支持“多层子程序”,即子程序中可以利用主程序的本地变量。这些变量可以通过调用栈传入子程序。
实例
汇编语言
以下MIPS汇编语言程序计算32+42{\displaystyle 3^{2}+4^{2}},并将结果存至寄存器s0。
main:li$a0,3li$a1,4jalsumsqmove$s0,$v0jmainendsumsq:addi$sp,$sp,-4# 在堆疊上分配空間sw$ra,0($sp)# 將sumsq的返回位址存入堆疊中jalsquaremove$t0,$v0move$a0,$a1jalsquareadd$v0,$v0,$t0lw$ra,0($sp)# 從堆疊中取回sumsq的返回位址addi$sp,$sp,4# 釋出堆疊上分配的空間jr$rasquare:mult$a0,$a0mflo$v0jr$ramainend:
这里,主程序(main)调用“sumsq”子程序并将返回地址存入寄存器ra,但是“sumsq”子程序需要调用“square”子程序。为保证sumsq的返回地址不被重写,这个地址被存储在栈中。在square子程序返回后,sumsq再从栈中取回其自身的返回地址。
安全性
在较底层语言(如汇编语言与C语言中),程控消息与数据可能一同被存入调用栈中,因此造成安全隐患,可能允许恶意程序通过栈缓冲区溢出(stack buffer overflow)来获取程序的控制权。
参见
内存管理
调用约定
栈溢出
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值