assembly - 返回地址寄存器如何在不将返回地址存储在堆栈上的处理器体系结构中工作?
问题描述
我试图弄清楚将调用的返回地址存储在寄存器(RR)中的架构如何工作(而不是在堆栈上推送和弹出返回地址)。
每次进行嵌套调用时,返回地址寄存器不会被覆盖(因此在一次返回之后不可能返回)?阅读我的作业问题,我应该修改一个汇编程序以使用一个 RR 寄存器来存储调用的返回地址,而不是在堆栈上推送和弹出它。我已经搜索过它是如何工作的,但要么那里什么都没有,信息被很好地隐藏了,要么我的谷歌搜索技能不是那么好。
我不是要求解决问题,但我想知道如何通过程序中的多次调用将返回地址存储在一个寄存器中是可行的,而无需随后将寄存器值存储在堆栈上(这会破坏点练习)。
谢谢你的帮助。
解决方案
假设不需要递归,您可以发明一个约定,将链接(返回寄存器)存储在不同的寄存器中,具体取决于嵌套级别。
请注意,经典模式下的 IBM 大型机没有堆栈。相反,调用者提供了一个由 R13 指向的保存区域,然后在调用时,R14 包含返回地址,R15 是被调用函数的基地址。对于递归,每个调用者在进行调用之前都会从堆中分配一个新的保存区域。约定是被调用者将 R13 存储在保存区域的适当位置,创建保存区域的链接链,称为“链接堆栈”。返回时,被调用者需要在返回之前释放其分配的保存区域。
推荐阅读
- android - 如何在移动设备中将屏幕另存为图像。我正在使用 kotlin 为 android 制作 meme creator 应用程序
- javascript - 为什么事件侦听器没有被删除
- mysql - mysqlsh:如何导入转储文件
- c# - 处理大文件流(读+写字节)
- jquery - 检查所有不是将所有总和添加到总输入中
- c++ - 为什么我得到变量“节点”不是类型名称错误
- json - 使用 XSLT 转换将 XML 转换为 JSON 后有什么方法可以删除根节点
- node.js - 为什么在使用维度时,Google 分析中的总用户数会有所不同?
- java - 如何在springboot中为DomainArgumentResolver编写测试类?
- git - 撤消 Git 远程分支签出