調用棧

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

基本介紹

  • 中文名:調用棧
  • 外文名:Call stack
  • 目的:存放子程式的返回地址
  • 領域:計算機
簡介,功能,彙編語言,安全性,

簡介

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

功能

調用棧的主要功能是存放返回地址。除此之外,調用棧還用於存放:
  • 本地變數:子程式的變數可以存入調用棧,這樣可以達到不同子程式間變數分離開的作用。
  • 參數傳遞:如果暫存器不足以容納子程式的參數,可以在調用棧上存入參數。
  • 環境傳遞:有些語言(如PascalAda)支持“多層子程式”,即子程式中可以利用主程式的本地變數。這些變數可以通過調用棧傳入子程式。

彙編語言

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

安全性

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

相關詞條

熱門詞條

聯絡我們