调用栈

✍ dations ◷ 2025-11-22 14:57:06 #计算机编程

调用栈(英语: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)来获取程序的控制权。

相关

  • 联邦调查局联邦调查局(英语:Federal Bureau of Investigation),简称联调局(FBI),前身是调查局(Bureau of Investigation,简称BOI),是美国司法部的主要执法、情报机构及调查单位,也是美国联邦政府最
  • 塞尔焦·马塔雷拉塞尔焦·马塔雷拉(意大利语:Sergio Mattarella,意大利语发音:,1941年7月23日-) 意大利政治家,2015年2月3日就任第12任意大利总统。他1983年至2008年是议员,1989年至1990年担任过教育
  • 人民民主党人民民主党(宗喀语:མི་སེར་དམངས་གཙོའི་ཚོགས་པ)是不丹政党之一,同时也是2008年不丹政治(英语:Politics of Bhutan)进行政治改革后活跃的两个政党之一。于20
  • L03A·B·C·D·G·H·QI·J·L·M·N·P·R·S·VATC代码L03(免疫促进药)是解剖学治疗学及化学分类系统的一个药物分组,这是由世界卫生组织药物统计方法整合中心(The WHO Collabor
  • 体积最大的生物世界已知最大的生物的定义有很多种,可能被定义成最大由体型、重量、高度或长度之极者。此外一些生物在群居的情况下制造出超有机体(superorganism),但不在此列。大部分体型大的
  • 比斯坎比斯坎国家公园(Biscayne National Park)是美国国家公园,位于南佛罗里达,霍姆斯特德以东。比斯坎国家公园保护的比斯坎湾是美国水肺潜水圣地之一。公园面积700平方公里,其中95%是
  • 价值联盟价值联盟(英语:Value Alliance)是一个于2016年成立,并由低成本航空组成的航空联盟,成立时有6个国家的8家航空公司参与。航点遍布大中华地区、东亚、东南亚、南亚、中东及澳洲。联
  • 遗魮遗魮(学名:)为辐鳍鱼纲鲤形目鲤科的其中一个种。该物种于1903年由George Albert Boulenger描述,分布于非洲尼罗河流域,体长可达5.4公分,可做为食用鱼。 维基物种中有关遗魮的数据
  • 戴骢戴骢(1933年1月-2020年2月7日),原名戴际安,江苏苏州人,中国俄语文学翻译家、编辑,主要译著有《金蔷薇》等。1933年生于江苏苏州。祖父和外祖父都是当地的书法家。抗日战争期间,由苏
  • 阿尔内·阿尔沃宁阿尔内·阿尔沃宁(芬兰语:Aarne Armas "Arska" Arvonen,1897年8月4日-2009年1月1日)是一位芬兰超级人瑞,享嵩寿111岁又150日。阿尔沃宁在出生时芬兰仍属于俄罗斯帝国的一部分。阿