调用栈

✍ dations ◷ 2025-11-17 16:01:29 #计算机编程

调用栈(英语:Call stack,港台称“呼叫堆叠”,英文直接简称为“栈”(the stack))别称有:执行栈(execution stack)、控制栈(control stack)、运行时栈(run-time stack)与机器栈(machine stack),是计算机科学中存储有关正在运行的子程序的消息的栈。有时仅称“栈”,但栈中不一定仅存储子程序消息。几乎所有计算机程序都依赖于调用栈,然而高级语言一般将调用栈的细节隐藏至后台。

调用栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生栈溢出。

调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:

以下MIPS汇编语言程序计算 3 2 + 4 2 {\displaystyle 3^{2}+4^{2}} ,并将结果存至寄存器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)来获取程序的控制权。

相关

  • 失踪的以色列十支派失踪的以色列十支派是指古代以色列人十二支派(或称氏族)中失去踪迹的10支。这10个支派属于北国以色列,在北国以色列被亚述摧毁(约公元前722年)以后,便消失于圣经的记载。这十个支
  • 鸟母鸟母,又称婆者、婆姐、婆祖,为华人信奉的女神,专责保佑幼童,是七星娘娘、临水夫人、注生娘娘等神祇的从神,传说其鸟首人身,或者人身而附有羽翼,故称“鸟母”,有四位、六位、十二位、
  • 姆瓦纳瓦萨利维·帕特里克·姆瓦纳瓦萨(英文Levy Patrick Mwanawasa,1948年9月3日-2008年8月19日),赞比亚总统(2002—2008),2002年1月首次当选。姆瓦纳瓦萨出生于穆富利拉,在赞比亚大学获得法律
  • 普超英普超英(1960年-),女,彝族,祖籍云南,生于湖北武汉,中国大陆演员。代表作有电视剧《情满珠江》,电影《女人花》、《复仇的女人》等。
  • 自由贸易协定自由贸易协定(英文:Free Trade Agreement,简称FTA)是两国或多国、以及与区域贸易实体间所签订的具有法律约束力的契约,目的在于促进经济一体化,消除贸易壁垒(例如关税、贸易配额和
  • 菱蟹总科见内文菱蟹科(学名:Parthenopidae)是螃蟹的一个科,是菱蟹总科(Parthenopoidea)之下唯一的一个科。其下有接近40个属。当中主要可再细分为两个亚科,而有三个属地位未定。
  • 首尔地下铁首尔地下铁(朝鲜语:서울 지하철/서울 地下鐵  */?)是位于韩国首尔的城市轨道交通系统,属于首都圈电铁的一部分。目前拥有9条路线,分别由2间公司营运。首尔地下铁分为9条线路。其
  • 沧月沧月 (1979年5月15日-),本名王洋,出生于浙江台州温岭,中国当代奇幻文学作家,大陆新派武侠小说代表人物之一。沧月自小喜爱阅读,尤其是金庸、温瑞安等人的作品。幼稚园时开始试笔,在蔗
  • 西华努斯·盖尔西华努斯·盖尔(印尼语:Selvanus Geh,1993年11月27日-),印尼男子羽毛球运动员。2013年11月,西华努斯·盖尔出战马来西亚国际挑战赛,与阿尔弗兰·埃科·普拉塞特亚合作赢得男子双打冠
  • 贺达贺达(?-233年),会稽郡山阴人,孙吴将军。贺齐长子。嘉禾二年(233年)三月,孙权派太常张弥、执金吾许晏、将军贺达率领大军万人,携带金银财宝、奇珍异贷及九锡齐备,乘船渡海至辽东郡,赏赐公