調用棧

調用棧(英語:Call stack,英文直接簡稱為“棧”(the stack))別稱有:執行棧(execution stack)、控制棧(control stack)、運行時棧(run-time stack)與機器棧(machine stack),是計算機科學中存儲有關正在運行的子程式的訊息的棧。有時僅稱“棧”,但棧中不一定僅存儲子程式訊息。幾乎所有電腦程式都依賴於調用棧,然而高級語言一般將調用棧的細節隱藏至後台。

簡介

調用棧最經常被用於存放子程式的返回地址。在調用任何子程式時,主程式都必須暫存子程式運行完畢後應該返回到的地址。因此,如果被調用的子程式還要調用其他的子程式,其自身的返回地址就必須存入調用棧,在其自身運行完畢後再行取回。在遞歸程式中,每一層次遞歸都必須在調用棧上增加一條地址,因此如果程式出現無限遞歸(或僅僅是過多的遞歸層次),調用棧就會產生棧溢出。

功能

調用棧的主要功能是存放返回地址。除此之外,調用棧還用於存放:

•本地變數:子程式的變數可以存入調用棧,這樣可以達到不同子程式間變數分離開的作用。

•參數傳遞:如果暫存器不足以容納子程式的參數,可以在調用棧上存入參數。

•環境傳遞:有些語言(如Pascal與Ada)支持“多層子程式”,即子程式中可以利用主程式的本地變數。這些變數可以通過調用棧傳入子程式。

彙編語言

調用棧 調用棧

以下MIPS彙編語言程式計算,並將結果存至暫存器s0。

這裡,主程式(main)調用“sumsq”子程式並將返回地址存入暫存器ra,但是“sumsq”子程式需要調用“square”子程式。為保證sumsq的返回地址不被重寫,這個地址被存儲在棧中。在square子程式返回後,sumsq再從棧中取回其自身的返回地址。

安全性

在較底層語言(如彙編語言與C語言中),程控訊息與數據可能一同被存入調用棧中,因此造成安全隱患,可能允許惡意程式通過棧緩衝區溢出(stack buffer overflow)來獲取程式的控制權。

相關詞條

熱門詞條

聯絡我們