簡介
調用棧最經常被用於存放子程式的返回地址。在調用任何子程式時,主程式都必須暫存子程式運行完畢後應該返回到的地址。因此,如果被調用的子程式還要調用其他的子程式,其自身的返回地址就必須存入調用棧,在其自身運行完畢後再行取回。在遞歸程式中,每一層次遞歸都必須在調用棧上增加一條地址,因此如果程式出現無限遞歸(或僅僅是過多的遞歸層次),調用棧就會產生棧溢出。
功能
調用棧的主要功能是存放返回地址。除此之外,調用棧還用於存放:
•本地變數:子程式的變數可以存入調用棧,這樣可以達到不同子程式間變數分離開的作用。
•參數傳遞:如果暫存器不足以容納子程式的參數,可以在調用棧上存入參數。
•環境傳遞:有些語言(如Pascal與Ada)支持“多層子程式”,即子程式中可以利用主程式的本地變數。這些變數可以通過調用棧傳入子程式。
彙編語言
以下MIPS彙編語言程式計算,並將結果存至暫存器s0。
這裡,主程式(main)調用“sumsq”子程式並將返回地址存入暫存器ra,但是“sumsq”子程式需要調用“square”子程式。為保證sumsq的返回地址不被重寫,這個地址被存儲在棧中。在square子程式返回後,sumsq再從棧中取回其自身的返回地址。
安全性
在較底層語言(如彙編語言與C語言中),程控訊息與數據可能一同被存入調用棧中,因此造成安全隱患,可能允許惡意程式通過棧緩衝區溢出(stack buffer overflow)來獲取程式的控制權。