调用栈(英语:Call stack,港台称“呼叫堆叠”,英文直接简称为“栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是计算机科学中存储有关正在运行的子程序的消息的栈。有时仅称“栈”,但栈中不一定仅存储子程序消息。几乎所有计算机程序都依赖于调用栈,然而高级语言一般将调用栈的细节隐藏至后台。
调用栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生栈溢出。
调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:
以下MIPS汇编语言程序计算,并将结果存至寄存器s0
。
main: li $a0, 3 li $a1, 4 jal sumsq move $s0, $v0 j mainendsumsq: addi $sp, $sp, -4 # 在堆疊上分配空間 sw $ra, 0($sp) # 將sumsq的返回位址存入堆疊中 jal square move $t0, $v0 move $a0, $a1 jal square add $v0, $v0, $t0 lw $ra, 0($sp) # 從堆疊中取回sumsq的返回位址 addi $sp, $sp, 4 # 釋出堆疊上分配的空間 jr $rasquare: mult $a0, $a0 mflo $v0 jr $ramainend: