为什么 $ra 被调用者保存在 RISC-V 中

2023-12-14

我发现在 RISC-V 中,ra调用者是否已保存,以 MIPS 为单位,ra是被调用者,这意味着在 RISC-V 中被调用者可以直接更改ra没有保存,但自从ra已经改变了,被调用者如何返回调用者?


无论名称如何,RISC V ra 和 MIPS $ra 的用法实际上是相同的。

由于调用者(需要返回到其调用者)和(非叶)被调用者都需要重新调整返回地址寄存器的用途,因此需要保留该寄存器中的值。唯一合乎逻辑的方法是在进入时保留寄存器一次并在退出时恢复它一次,就像 s/$s 保留的、被调用者保存的寄存器一样。

然而,一旦这样保存,返回地址寄存器就可以被函数重新用于其他用途,并且任何此类用法都将遵循调用者保存约定(与 $s 寄存器不同,$s 寄存器保证在调用过程中被保留)。

因此,实际上,ra/$ra 可以在不同时间表现为被调用者保存和调用者保存。

调用者不能依赖放置在 ra/$ra 中的值在函数调用中幸存(就像使用 $s 寄存器一样),因此调用者保存。然而,当被调用者保留 ra/$ra 时,它会像 $s 被调用者保存寄存器一样保留它 - 即在序言/尾声中。

相比之下,如果调用者保留 $t 寄存器以便在函数调用中生存,则必须在每次更新值后(例如,至少在第一次初始化之后)保留 $t 寄存器,这就是调用者保存行为。这些寄存器先初始化,然后保留,而 $s 寄存器先保留,然后初始化。

ra/$ra 具有被调用者和调用者保存的行为:它需要在初始化和重用/重新调整用途之前保留,这是一种被调用者保存方法,但是,放入 $ra 的变量将无法在函数调用中幸存,因此为了在函数调用中生存,需要初始化然后保存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 $ra 被调用者保存在 RISC-V 中 的相关文章

  • I 类型指令的 MIPS 周期数 (addi)

    So on https en wikipedia org wiki Cycles per instruction https en wikipedia org wiki Cycles per instruction它说 对于多周期MIPS
  • 如何查看JVM中JIT编译的代码?

    有什么方法可以查看 JVM 中 JIT 生成的本机代码吗 一般用法 正如其他答案所解释的 您可以使用以下 JVM 选项运行 XX UnlockDiagnosticVMOptions XX PrintAssembly 根据特定方法进行过滤 您
  • 英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?

    我在Intel的页面上找到了 https ark intel com products 97123 Intel Core i5 7500 Processor 6M Cache up to 3 80 GHz https ark intel c
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • 使用 MIPS 从 Big Endian 到 Little Endian 无需逻辑运算?

    我正在使用 MIPS QtSpim 将 32 位字从 Big Endian 转换为 Little Endian 我下面显示的内容已检查且正确 不过我想知道还有什么其他方法可以让我进行转换 我虽然只使用了旋转和移位 但如果没有逻辑运算 我就无
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会

随机推荐

  • Firebase:Cloud Firestore:listDocuments:文档读取成本 1 或 N?分布式计数器的可能替代方案?

    构建社交媒体应用程序并应对 1write doc sec 限制 因此 将投票数据保留在邮寄文档中将无法大规模发挥作用 我已阅读 分布式计数器 但文档读 写成本呈线性缩放 我一直在探索可用的 firebase 函数 并对 listDocume
  • 扩展 Core Data 生成的 NSManagedObject 类

    我第一次处理 Core Data 我想知道扩展 Xcode 为我的 NSManagedObject 实体生成的类的最佳实践是什么 I saw 发电机我也一直在使用与建议类似的方法超级快乐轻松获取核心数据 所以我有三种类型的课程 EasyFe
  • Fortran90 未分类语句 While 循环

    我正在尝试在 Fortran90 中运行一些代码片段 但在 while 语句中出现未分类语句错误 我在网上查了一下 找不到为什么 while 语句会发生这种情况 这是我收到的错误 Test f90 11 4 while R lt Minim
  • GCP - terraform 删除了所有政策,我该如何恢复

    我跟随地形运行 我使用时犯了一个错误google storage bucket iam policy代替google storage bucket iam binding因此 它没有添加新策略 而是替换了所有现有策略 data google
  • 从 .net 中的 xsd 架构文件中提取枚举值

    如何使用 net 以编程方式从 xsd 架构文件中提取元素的枚举约束值 例如 我想从以下 xsd 中提取 奥迪 高尔夫 和 宝马
  • 为 Angular 2 身份验证前端添加会话超时

    我已按照以下教程 1 为我的应用程序设置身份验证 现在我需要通过添加 Angular 2 前端的会话超时来修改身份验证 即 20 分钟后会话应过期并要求用户再次登录 我如何为我的身份验证系统开发此扩展功能 1 http jasonwatmo
  • PHPMailer 不支持 Gmail SMTP [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 以下代码可以在我的 xampp 本地服务器上运行 但不能在远程主机上发送电子邮件 我收到此错误 邮件无法发送 Mailer 错误 SMTP 连接 失败 require once heade
  • ggplot 置信区间未填充我的线性混合模型的整个数据集

    my ggplot R code works perfectly ok with my other datasets but I m stumbled with why it s not working for one particular
  • 开发一个在用户使用 xcode 登录之前运行的 osx 守护进程

    您好 我正在尝试使用 Objective C xcode 开发一个守护进程 我是 mac 世界的新手 我可以了解在 Xcode 中选择什么项目模板以及如何操作吗 我可以获得简单且基本的守护程序示例源代码吗 命令行工具 项目足以开始编写守护程
  • 如何将 JAR 依赖项包含到 AAR 库中

    Summary 我有一个依赖于 JAR 文件的 AAR 文件 当我构建 AAR 项目时 它不包含 JAR 代码 Details 我有一个 Java SDK 库项目 其中包含我们用于 Java Web 项目等的代码 该库是使用创建的Gradl
  • 无法在某些 Android 手机上使用 SmsManager 发送短信

    我的移动应用程序偶尔会发送短信 在大多数手机上一切正常 但我开始收到一些用户发来的电子邮件 说明消息不会发出 这是我正在使用的代码 SmsManager sms SmsManager getDefault sms sendTextMessa
  • 更新:根据文件扩展名将文件从一个文件夹移动到另一个文件夹

    情况 我正在进行自动化操作 只需从一组文件中下载 CSV 文件 现在我只想将 CSV 文件从一个文件夹移动到另一个文件夹 问题 您能否向我提供代码 以便在移动文件后立即从源文件夹中删除文件 到目前为止 这是我的代码 public class
  • 当它用作自动热键中的热键时,如何将字母本身发送

    例如 我想按 v 通过自动热键获取 asdfv 但是当我定义如下时 v 发送 asdfv 脚本运行到无限循环 因为最后一个 v 被覆盖为快捷方式 所以问题是 我怎样才能得到我想要的东西 两种方式 UseHook On v send asdf
  • 在 UILabel/UITextView 中触摸单词

    我想做的是创建一个文本容器组件 该组件能够在触摸时指示最近的单词是什么 即触摸点 后面 的单词 首先 我创建了一个 UILabel 子类并重写 TouchesEnded withEvent 方法来确定触摸的 CGPoint 我还编写了一个方
  • 使用像 Spinner 这样的 jquery 增加文本输入的值

    尝试使用 Jquery 创建一个简单的旋转效果 即两个带有文本字段的按钮 向上和向下 向上按钮增加值 向下按钮减小值 增加步数 或 1 任何建议 如 ui spinner 都是最明确的 不工作 我是 jquery 新手 一定是这样的 up
  • 三星 Galaxy SIII 的相机是否存在缺陷?

    我使用以下代码启动相机 但是 有 3 4 的时间 照片没有保存到内存中 这种情况仅发生在 Galaxy SIII 上 它适用于 Nexus S 和 Nexus One public void photoNew holdingImage ge
  • 警告:内置函数“strlen”和“strcpy”的隐式声明不兼容[重复]

    这个问题在这里已经有答案了 我刚刚完成了我的刽子手游戏 作为最后一步 我正在进行一些代码清理和优化 但我似乎无法理解为什么我收到以下两个警告 警告 内置函数 strlen 的隐式声明不兼容 警告 内置函数 strcpy 的隐式声明不兼容 使
  • 如何退出独立模式或编辑器模式

    我在 Windows 10 64 位上使用 unity 5 4 1f1 Personal 我将解释我所做的所有步骤以及迄今为止我尝试过的所有事情 我第一次使用原始代码创建了一个新的 c 文件 现在 当我按 Escape 键时 它将返回编辑器
  • 内有较长任务的角间隔管道

    我的组件中有这段代码 ngOnInit this counterValue interval 1000 pipe switchMap gt this perfService getCounter this counterUrl map i
  • 为什么 $ra 被调用者保存在 RISC-V 中

    我发现在 RISC V 中 ra调用者是否已保存 以 MIPS 为单位 ra是被调用者 这意味着在 RISC V 中被调用者可以直接更改ra没有保存 但自从ra已经改变了 被调用者如何返回调用者 无论名称如何 RISC V ra 和 MIP