调用栈

✍ dations ◷ 2025-11-28 09:53:50 #计算机编程

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

相关

  • IFNG1EKU, 1FG9, 1FYH, 1HIG, 3BES· extracellular space· negative regulation of transcription from RNA polymerase II promoter · neutrophil apoptotic process · r
  • 金质奖章金牌通常是奖励给某项竞赛(例如奥运会等体育比赛)第一名优胜者的奖牌。竞赛的二、三名优胜者一般是分别获得银牌和铜牌。金子是最贵重的金属之一,因此称之为金牌表示该奖项最为
  • 1698年重要事件及趋势重要人物
  • 帕翠夏·尼尔帕翠夏·尼尔(英语:Patricia Neal,1926年1月20日-2010年8月8日),美国女演员,曾获得奥斯卡最佳女主角奖。
  • 观音禅堂坐标:25°02′22″N 121°31′19″E / 25.03937°N 121.521889°E / 25.03937; 121.521889曹洞宗大本山台湾别院钟楼,为台湾台北市市定古迹,状似城门,为东和禅寺的入口。钟楼位
  • 三门峡水库三门峡水利枢纽工程是中华人民共和国建立后在黄河中上游段建设的第一座大型水利工程项目,其连接河南省三门峡市及山西省平陆县。工程于1957年4月动工,1961年4月基本建成投入运
  • 優質經濟艙優質經濟艙(Premium Economy Class),或称豪经舱、特级经济舱(Special economy class)、经济舱、高端经济舱、超级经济舱、尊尚经济舱,是民航服务中,介于经济舱与商务舱间的舱等。价
  • 卡洛斯·格雷西卡洛斯·格雷西(葡萄牙语:Carlos Gracie,1902年9月14日-1994年10月7日),生于巴西贝伦,为格雷西家族的长子。他与他的兄弟艾里奥·格雷西等人,发展出格雷西柔术这门武术。卡洛斯的父
  • 山边英彦山边英彦(1923年8月22日-1960年11月20日),日本数学家,生于日本兵库县芦屋市。他最有名的结果是解决希尔伯特第五问题。山边英彦1947年毕业于东京大学,到大阪大学任助理,1952年至195
  • GD X TAEYANGGD X TAEYANG是韩国经纪公司YG娱乐推出的企划组合,由韩国男子音乐组合BIGBANG的队长G-Dragon及成员太阳在2014年组成的子团体。G-Dragon及太阳是在12岁时被YG娱乐的社长梁铉