调用栈

✍ dations ◷ 2025-11-23 16:09:49 #计算机编程

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

相关

  • 首席执行官首席执行官(英语:Chief Executive Officer,缩写:CEO),是许多企业,尤其是美国企业的头衔,是公司三长之一(另二为董事长、财务长),是在一个企业集团、财阀或行政单位中的最高行政负责人。
  • 斯帕达宫斯帕达宫(意大利语:Palazzo Spada)是罗马市中心的一座宫殿,位于 Piazza Capo di Ferro 广场13号,非常接近法尔内塞宫。它有一个花园面向台伯河。宫殿内拥有大量的艺术收藏品,开辟
  • 内蒙古民族大学内蒙古民族大学位于内蒙古东部的通辽市,始建于1958年,是内蒙古自治区政府和国家民委共建的一所综合性民族大学。2000年6月内蒙古民族师范学院、内蒙古蒙医学院、哲里木畜牧学
  • 平安京平安京是过往日本的首都,别称“洛阳”“京洛”。位于现在京都市的市中心区域。从794年(延历13年)桓武天皇从旧都长冈京迁都,至1868年(明治1年)明治天皇迁都东京为止,立都时间超过一
  • 香严寺香严寺,又名“长寿寺”、“香严长寿寺”、“显通禅寺”,位于中国河南省南阳市淅川县仓房镇西北部的白崖山群中,东临龙山,西接虎山,北依后岭,南拱面山,整个地形若莲花状,香严寺恰居中
  • 甲型流感病毒H1N2亚型H1N2亚型(influenza A virus subtype H1N2)是甲型流感病毒的一种。近年来在人类和猪之间引起瘟疫。H1N1、H1N2、H3N2是已知的现代人类间流行的流感病毒。此亚型与其他亚型相比
  • 陀螺战士剧情列表以下动画剧集按照首播顺序排列(不包括首播后的任何重播)
  • 茜素黄R茜素黄R(Alizarine Yellow R)是由重氮化合物偶联反应制成的黄色偶氮染料。一般会使用其钠盐。纯的茜素黄R会是铁锈颜色的固体。茜素黄R的主要用途是酸碱指示剂。
  • 约翰内斯·哈特曼约翰内斯·弗朗茨·哈特曼(1865年1月11日—1936年9月13日)是德国物理学家和天文学家。在1904年,在研究参宿三的光谱时,他注意到大部分的频谱中都有一些偏移,除了钙线以外,他解读为
  • M.U.G.E.NM.U.G.E.N,又称MUGEN,是一款由美国Elecbyte用C语言与Allegro程式库所开发的免费2D格斗游戏引擎,发布于1999年-2002年间,2009年后又有新版本的发布。MUGEN和日语中的“无限”同音