调用栈

✍ dations ◷ 2025-04-16 18:28:35 #计算机编程

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

相关

  • HDS《瑞士历史辞典》(德语:Historische Lexikon der Schweiz;法语:Dictionnaire Historique de la Suisse;意大利语:Dizionario Storico della Svizzera;罗曼什语: Lexicon Istoric Re
  • 中央大平原大平原(英语:Great Plains),多称北美大平原、北美大草原,是北美洲中部一块广袤的平原地区,大致位于密西西比河以西、落基山脉以东、格兰德河以北。自然植被以草为主。大平原东西长
  • P2P WikiWiki引擎,或称为Wiki软件,是指用来架设Wiki的软件。广义来说,即是一种软件能作为网络共笔,供网民自行编辑,并最终集合成完整的数据库。狭义来说,即是能达成维基百科样式的软件。由
  • span class=nowrapPbSOsub4/sub/span硫酸铅,分子式为PbSO4,白色单斜或正交晶体,难溶于水,有毒。是铅矾或硫酸铅矿的主要成分,熔点1443K,Ksp=1.06×10−8,主要用于白色油漆颜料、铅蓄电池等。可溶于硝酸、浓硫酸、饱和
  • 4号染色体4号染色体是人类细胞中24种(组成23对)染色体中的其中一种,是人体内第四大的染色体,拥有大约1.90亿个DNA碱基对,约占所有人类基因组中碱基总数的6%到6.5%。下列与4号人类染色体的
  • 蒂克路德维希·蒂克(Ludwig Tieck)(1773年5月31日- 1853年4月28日)是德国诗人,翻译家,编辑,小说家,作家和评论家,是18世纪末和19世纪初的浪漫主义运动的元勋之一。路德维希·蒂克出生于柏
  • 《8½》(又译八部半,意大利语:Otto e Mezzo)是意大利导演费德里柯·费里尼于1963年执导的电影,它被许多影评人评为“有史以来最出色的电影之一”,荣获多项国际大奖,包括奥斯卡最佳
  • 洪绂曾洪绂曾(1932年-2012年4月8日),出生于江苏南京,安徽泾县人,中华人民共和国农业科学家、政治人物。毕业于沈阳农学院(原复旦大学农学系),后担任吉林省农业科学院院长。1989年,升任中华人
  • .pk.pk为巴基斯坦国家及地区顶级域(ccTLD)的域名。此外还拥有乌尔都语顶级域名پاکستان.‎。A .ac .ad .ae .af .ag .ai .al .am .ao .aq .ar .as .at .au .aw .ax .az 
  • 阿洛依斯·伊拉塞克阿洛依斯·伊拉塞克 (1851年8月23日 – 1930年3月12日)是一名捷克作家, 历史小说和戏剧作家。 伊拉塞克曾先后在利托米什尔和布拉格担任高中历史老师,直到1909年退休 。 他写了