调用栈

✍ dations ◷ 2025-02-24 04:48:16 #计算机编程

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

相关

  • Buruli, or Bairnsdale, ulcer布如里氏溃疡(Buruli ulcer),又称为班兹达溃疡(Bairnsdale ulcer)、塞尔氏溃疡(Searl's ulcer(英语:Searl's ulcer))、丹特里溃疡(Daintree ulcer),为一种由溃疡分枝杆菌(英语:Mycobacteriu
  • 法罗群岛克朗法罗群岛克朗为法罗群岛流通货币,由丹麦国家银行发行。法罗群岛克朗不是一种独立的货币,而是丹麦克朗的一个版本,与丹麦克朗等值,因此在ISO 4217中没有自己的代码。1克朗=100欧
  • 斯芬克斯猫斯芬克斯猫(Sphynx)又称加拿大无毛猫。这种猫是由于基因突变而产生的品种。体重3.5到7公斤,肌肉发达,毛发稀疏,皮肤皱褶似羚羊皮。头部棱角分明。微呈三角型。眼大呈柠檬状,多数呈
  • 高雄市国乐团高雄市国乐团(Kaohsiung Chinese Orchestra;简称:高市国、KCO)是附设于财团法人高雄市爱乐文化艺术基金会的国乐团。1989年3月高雄市市长苏南成任内成立。前身是高雄市实验国
  • 含铜避孕器含铜避孕器(Intrauterine device with copper)也称为铜制宫内避孕器,是一种借由释放铜离子达到避孕效果的宫内节育器,。本品可用来避孕,若有进行过无避孕措施的非安全性行为,在五
  • 多米尼哥·基兰达奥多米尼哥·基兰达奥(Domenico Ghirlandaio 意大利语:;1449年-1494年1月11日),或译多梅尼科·基尔兰达约,是一位意大利文艺复兴时期的画家,也是佛罗伦萨在文艺复兴时期涌现的的第三代
  • 本顿本顿县(英语:Benton County)是美国华盛顿州南部的一个县,北、东、南为哥伦比亚河所围绕,南邻俄勒冈州。面积4,559平方公里。根据美国2010年人口普查,共有人口175,177人。 县治普罗
  • 隐蔽行动隐蔽行动(covert action)指在暗中实施的军事、情报或执法行动,通常在正式渠道以外进行。使用隐蔽行动的目的是在实现任务目标的同时,不让外界了解行动的赞助者与执行者。资金来
  • 犁 (单位)犁是台湾的面积单位。明郑王朝以来的台湾开垦者,因多开垦农田,遂是以犁为单位,一犁为五甲,约等于台湾日治时期的14670坪,意即48496平方米。平方尧米、平方佑米(Ym²) 平方泽米、
  • 斯洛伐克交通斯洛伐克的交通网由公路、铁路、航空和内河航道组成。斯洛伐克是一个发达的东欧国家,交通网也较为完善。斯洛伐克国内铁路网全长3,662 km,高速公路网全长225.25 km。斯洛伐