族谱网 头条 人物百科

调用栈

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:528
转发:0
评论:0
功能调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:本地变量:子程序的变量可以存入调用栈,这样可以达到不同子程序间变量分离开的作用。参数传递:如果寄存器不足以容纳子程序的参数,可以在调用栈上存入参数。环境传递:有些语言(如Pascal与Ada)支持“多层子程序”,即子程序中可以利用主程序的本地变量。这些变量可以通过调用栈传入子程序。实例汇编语言以下MIPS汇编语言程序计算32+42{\displaystyle3^{2}+4^{2}},并将结果存至寄存器s0。main:li$a0,3li$a1,4jalsumsqmove$s0,$v0jmainendsumsq:addi$sp,$sp,-4#在堆疊上分配空間sw$ra,0($sp)#將sumsq的返回位址存入堆疊中jalsquaremove$t0,$v0move$a0,$a1jalsquareadd$v0,$v0,$t0lw$ra...

功能

调用栈的主要功能是存放返回地址。除此之外,调用栈还用于存放:

本地变量:子程序的变量可以存入调用栈,这样可以达到不同子程序间变量分离开的作用。

参数传递:如果寄存器不足以容纳子程序的参数,可以在调用栈上存入参数。

环境传递:有些语言(如Pascal与Ada)支持“多层子程序”,即子程序中可以利用主程序的本地变量。这些变量可以通过调用栈传入子程序。

实例

汇编语言

以下MIPS汇编语言程序计算32+42{\displaystyle 3^{2}+4^{2}},并将结果存至寄存器s0。

main:li$a0,3li$a1,4jalsumsqmove$s0,$v0jmainendsumsq:addi$sp,$sp,-4# 在堆疊上分配空間sw$ra,0($sp)# 將sumsq的返回位址存入堆疊中jalsquaremove$t0,$v0move$a0,$a1jalsquareadd$v0,$v0,$t0lw$ra,0($sp)# 從堆疊中取回sumsq的返回位址addi$sp,$sp,4# 釋出堆疊上分配的空間jr$rasquare:mult$a0,$a0mflo$v0jr$ramainend:

这里,主程序(main)调用“sumsq”子程序并将返回地址存入寄存器ra,但是“sumsq”子程序需要调用“square”子程序。为保证sumsq的返回地址不被重写,这个地址被存储在栈中。在square子程序返回后,sumsq再从栈中取回其自身的返回地址。

安全性

在较底层语言(如汇编语言与C语言中),程控消息与数据可能一同被存入调用栈中,因此造成安全隐患,可能允许恶意程序通过栈缓冲区溢出(stack buffer overflow)来获取程序的控制权。

参见

内存管理

调用约定

栈溢出


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 堆栈
操作堆叠数据结构使用两种基本操作:推入(push)和弹出(pop):推入:将数据放入堆叠的顶端(阵列形式或串列形式),堆叠顶端top指标加一。弹出:将顶端数据资料输出(回传),堆叠顶端资料减一。特点栈的基本特点:先入后出,后入先出。除头尾节点之外,每个元素有一个前驱,一个后继。抽象定义以下是堆栈的VDM(ViennaDevelopmentMethod(英语:ViennaDevelopmentMethod)):函数签名:此处的N代表某个元素(如自然数),而U表示集合求交。语义:软件堆栈阵列堆叠堆栈可以用链表和数组两种方式实现,一般为一个堆栈预先分配一个大小固定且较合适的空间并非难事,所以较流行的做法是Stack结构下含一个数组。如果空间实在紧张,也可用链表实现,且去掉表头。这里的例程是以数组实现的。#include#include#include#definestackstructStack...
· 尾调用
描述当一个函数调用发生时,电脑必须“记住”调用函数的位置—返回位置,才可以在调用结束时带着返回值回到该位置,返回位置一般存在调用栈上。在尾调用的情况中,电脑不需要记住尾调用的位置而可以从被调用的函数直接带着返回值返回调用函数的返回位置(相当于直接连续返回两次),尾调用消除即是在不改变当前调用栈(也不添加新的返回位置)的情况下跳到新函数的一种优化(完全不改变调用栈是不可能的,还是需要校正调用栈上形参与局部变量的信息。)对函数调用在尾位置的递归或互相递归的函数,由于函数自身调用次数很多,递归层级很深,尾递归优化则使原本O(n)的调用栈空间只需要O(1)。因此一些编程语言的标准要求语言实现进行尾调用消除,例如Scheme与ML家族的语言。在Scheme中,语言标准还将尾位置形式化,指定了各种语法中允许尾调用的地方。以Python为例,主要区分普通递归和尾递归对栈空间的使用:defrecsum(x...
· 远程过程调用
历史起源有关RPC的想法至少可以追溯到1976年以“信使报”(Courier)的名义使用。RPC首次在UNIX平台上普及的执行工具程序是SUN公司的RPC(现在叫ONCRPC)。它被用作SUN的NFC的主要部件。ONCRPC今天仍在服务器上被广泛使用。另一个早期UNIX平台的工具是“阿波罗”计算机网络计算系统(NCS),它很快就用做OSF的分布计算环境(DCE)中的DCE/RPC的基础,并补充了DCOM。信息传递远程过程调用是一个分布式计算的客户端-服务器(Client/Server)的例子,它简单而又广受欢迎。远程过程调用总是由客户端对服务器发出一个执行若干过程请求,并用客户端提供的参数。执行结果将返回给客户端。由于存在各式各样的变体和细节差异,对应地派生了各式远程过程调用协议,而且它们并不互相兼容。标准化的沟通机制为了允许不同的客户端均能访问服务器,许多标准化的RPC系统应运而生了。其...
· 程维宗与徽州屯溪老街“八家栈”
程维宗与徽州屯溪老街“八家栈”徽州屯溪老街历史悠久。历史上,屯溪是由新安江、横江、率水三江汇流之地的一个水埠码头发展起来的,这也就是今天屯溪老街所在的位置。老街的西端即老大桥在桥头紧连的一段曲尺形街道,原名“八家栈”。这里就是老街的发祥地,也是屯溪的发祥地。这个“八家栈”与新安程氏族人有着历史渊源。新安程氏族人程维宗是元代人,是有历史记载的屯溪老街最早的商人,也是今日黄山市屯溪老街的创建者。程维宗于元朝至顺三年(1332年)出生在一个商人家庭。程维宗的父亲,名程观保,自号静翁。早年习武,年轻时即出外经商,后经薛城(今山东滕县)县宰唐子华的举荐当了一名捕事(即辅佐县令、专司刑讯的小官)。元朝至正年间,政权腐败黑暗,官府横征暴敛,人民纷纷参加红巾军起义武装,遭到统治者残酷。薛城是红巾军活动地区之一,有一次当地官府抓了300余名红巾军和无辜百姓,打算全部杀戮。程观保不忍杀害,将他们尽行放走,自己...
· 开放网络运算远程过程调用
技术规格于1995年出版的RFC1831描述了ONCRPC的内容。出版于2009年的RFC5531是现行版本。至于ONCRPC的认证机制则在RFC2695,RFC2203,与RFC2623中描述。参考文献参见XDR

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信