调用栈

✍ dations ◷ 2025-11-30 00:32:33 #计算机编程

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

相关

  • 玉米玉米(学名:Zea mays)是一年生禾本科草本植物,是全世界总产量最高的重要粮食作物。同时也可以当作饲料使用,还有在生物科技产业作为乙醇燃料的原材料。而且玉米更在各个化工领域被
  • 邪恶轴心“邪恶轴心”(英语:Axis of evil)是美国总统乔治·沃克·布什于2002年1月在他的国情咨文中所发表的看法,意指“赞助恐怖主义的政权”;其中明确指出的国家包括伊朗、伊拉克(萨达姆
  • 休宁休宁县是中国安徽省黄山市下辖的一个县,位于安徽、江西、浙江三省交界处。休宁县是古徽州府一府六县之一,被誉为“中国第一状元县”。东汉建安十三年(208年)建休阳县,距今已有180
  • 福建台湾承宣布政使司福建台湾等处承宣布政使司简称台湾布政使司或台湾布政司,成立于光绪十三年(1887年);台湾正式建省后。台湾布政使司实为清治时期此阶段之台湾省的最高财政、民政统治衙门,隶属于建
  • 辰州辰州,中国隋朝时设置的州。在今湖南省、贵州省境内。隋开皇九年(589年)改武州置,治所在龙檦县(今湖南省洪江市西北黔城镇),旋移治沅陵县(今属湖南省)。以境内辰溪得名。辖境相当今湖
  • 克利夫兰国家森林克利夫兰国家森林(英语:Cleveland National Forest)是一座美国国家森林,占地460,000英亩(1,900平方千米),大部分植被是浓密常绿阔叶灌丛,也有少许河岸林(英语:riparian),林区内多为地中
  • 希道什·朱迪斯希道什·朱迪斯(匈牙利语:Hidasi Judit,1948年7月11日-),匈牙利语言学家, 布达佩斯商科大学国际关系学院的教授, 布达佩斯商科大学教授。是一名匈牙利女语言学家。她出生于1948年7
  • 约翰·格奥尔基·特拉勒斯约翰·格奥尔基·特拉勒斯(Johann Georg Tralles),1763年10月15日生,1822年11月19日去世,是一位德国数学家和物理学家。他出生于德国汉堡,1783年始就读于哥廷根大学,1785年成为伯尔
  • 保罗·戴密微保罗·戴密微(法语:Paul Demiéville,1894年9月13日-1979年3月23日),法国汉学家,敦煌学著名研究学者。戴密微出生于瑞士洛桑。1915年在伦敦开始学习汉语,然后到法国国立东方语言文化
  • 微波光子雷达微波光子雷达是指利用微波光子技术来实现传统雷达在电域中进行的上变频、下变频、去谐等信号处理程序的雷达系统。