【发布时间】:2021-06-11 09:22:20
【问题描述】:
假设用 RISC-V 汇编编写了以下简单的 main 函数:
.globl main
main:
addi s3,zero,10 #Should this register (s3) be saved before using?
由于s3 是一个“已保存的寄存器”,因此应遵循过程调用约定,因此,该寄存器应在使用前压入堆栈。但是,通过查看源文件,没有其他程序使用过该寄存器,将寄存器保存到堆栈似乎是多余的。
我的问题是,是否应该在每次使用之前保存这些类型的寄存器,即使这意味着为了遵守调用约定而编写更多(冗余)代码?有时可以忽略这些约定以提高性能吗?
在上面的示例中,是否应该保存寄存器,因为不知道主调用者是否一直在使用s3 寄存器?
【问题讨论】:
-
是的,每次都应该保存它们,即使这意味着更多的代码。是的,
main的调用者(例如 libc 初始化代码)可以将s3用于自己的目的。
标签: function assembly calling-convention riscv