ado*_*660 5 assembly calling-convention riscv
RISC-V 调用约定规定寄存器 a0 和 a1 可用于返回值,而不是所有 8 个寄存器 a0~a7。当需要“返回”两个以上的值时,我们可以使用堆栈。为什么?这样做有什么好处吗?
我正在学习 RISC-V 语言,作为计算机体系结构研究的一部分。我注意到我们可以使用所有八个 a0~a7 寄存器将参数传递给函数,但根据一些 RISC-V 调用约定,只有其中两个(a0 和 a1)可用于返回返回值,例如了解 RISC-V 调用约定和RISC-V 调用约定。我很困惑为什么约定包含只有 a0 和 a1 应该用于返回的规则。我浏览了上面提到的两篇文章,但没有找到任何解释这一点的内容。在我看来,这些a0~a7寄存器在函数调用之间不被保留,这表明我们可以在函数中自由地使用它们。因此,如果需要,我们可以而且应该使用它们中的任何一个来传递返回值,以方便和高效。总之,有什么理由要求我们限制返回值到a0和a1寄存器吗?
PS我刚刚注意到这个问题Whytworeturnregisters(inmanyprocedurecallsconventions/ABIs),它告诉我连续的寄存器可以用于大数字。然而,我的观点是,为什么我们限制自己在a2~a7中放入更多的返回值,即使看起来没有明显的缺点?或者,如果我使用a2~a7作为返回值,违反约定,会不会很糟糕?
免责声明:以下是完整的猜测。
函数很少返回多个值,并且调用约定往往是为 C 定制的,而您甚至无法做到这一点。risc-v 和其他架构上的两个返回寄存器用于不适合单个寄存器的类型,通常是双宽度整数或小结构。较大的结构通常在内存中处理,通常不需要同时使用寄存器中的所有成员。这也适用于被调用者,它很可能在内存中创建返回值,因此需要额外的指令才能加载到寄存器中,以便调用者立即将其复制回来。将指针传递给预期返回位置可以直接在正确的位置创建结果。
也就是说,对于您自己的功能,您可以使用任何您想要的东西。甚至编译器也对私有函数使用临时约定。