RISC-V基础之函数调用(四)非叶函数调用(包含实例)

叶函数是指不调用其他函数,也不改变任何非易失性寄存器的函数2。叶函数通常是一些简单的操作,如数学运算或逻辑判断。叶函数的特点是可以通过模拟返回来展开,即不需要保存或恢复寄存器的状态。

非叶函数是指调用其他函数或改变非易失性寄存器的函数。非叶函数通常是一些复杂的操作,如循环或递归。非叶函数的特点是需要使用静态数据来注释,以便在处理异常时恢复寄存器的状态。

非易失性寄存器是指在断电后仍能保持其内容不变的寄存器。非易失性寄存器通常用于保存一些重要的数据或状态,例如程序计数器、栈指针、返回地址等。

易失性寄存器是指在断电后会丢失其内容的寄存器。易失性寄存器通常用于保存一些临时的数据或操作数,例如通用寄存器、浮点寄存器、向量寄存器等。

非易失性寄存器和易失性寄存器在函数调用时有不同的约定。一般来说,被调用函数需要保护非易失性寄存器的值,即在使用之前将其压入栈中,在返回之前将其弹出栈中。而被调用函数可以自由地使用易失性寄存器,而不需要保存或恢复它们的值。这样可以减少函数调用时的开销和复杂度

函数调用时,需要遵循以下两条规则:

  • 调用者保存规则:在函数调用之前,调用者必须保存任何临时(t0--t6 和 a0--a7)寄存器,这些寄存器在调用后仍然需要。在调用后,它必须在使用它们之前恢复这些寄存器。
  • 被调用者保存规则:在被调用者改变任何保留寄存器(s0--s11 和 ra)之前,它必须保存这些寄存器。在返回之前,它必须恢复这些寄存器。

上图给出一个非叶函数 f1 和一个叶函数 f2 的代码示例,以及它们如何遵循这些规则。非叶函数是指调用其他函数的函数,叶函数是指不调用其他函数的函数。

f1 保持 i 在 s4 和 x 在 s5;f2 保持 r 在 s4。f1 使用了保留寄存器 s4、s5 和 ra,所以它最初将它们压入栈中,以遵循被调用者保存规则。它使用 t3 来保存中间结果 (a--b),这样就不需要为这个计算保留另一个寄存器。

在调用 f2 之前,f1 将 a0 和 a1 保存到栈中,以遵循调用者保存规则,因为这些是非易失性寄存器,f2 可能会改变它们,而 f1 在调用后仍然需要它们。ra 改变了,因为它被 f2 的调用覆盖了。虽然 t3 也是一个非易失性寄存器,f2 可能会覆盖它,但 f1 不再需要 t3,所以不必保存它。

f1 然后将参数传递给 f2 在 a0 中,进行函数调用,并在 a0 中得到结果。f1 然后恢复 a0 和 a1,因为它仍然需要它们。当 f1 完成时,它将返回值放在 a0 中,恢复寄存器 s4、s5、ra 和 sp,并返回。f2 根据被调用者保存规则保存和恢复 s4(和 sp)。

仔细观察后,可能会注意到 f2 没有修改 a1,所以 f1 不需要保存和恢复它。然而,编译器不能总是很容易地确定哪些非易失性寄存器可能在函数调用期间被干扰。因此,一个简单的编译器总是让调用者保存和恢复任何它在调用后需要的非易失性寄存器。一个优化的编译器可以观察到 f2 是一个叶过程,并可以将 r 分配给一个非易失性寄存器,避免了保存和恢复 s4 的需要。下图显示了函数执行期间的栈情况。对于这个例子,栈指针最初从 0xBEF7FF0C 开始。

相关推荐
蒹葭玉树5 天前
【C++上岸】C++常见面试题目--操作系统篇(第三十期)
c++·面试·risc-v
国科安芯7 天前
面向星载芯片原子钟的RISC-V架构MCU抗辐照特性研究及可靠性分析
单片机·嵌入式硬件·架构·制造·risc-v·pcb工艺·安全性测试
思尔芯S2C9 天前
FPGA原型验证实战:如何应对外设连接问题
fpga开发·risc-v·soc设计·prototyping·原型验证
加强洁西卡9 天前
【RISC-V】从C到可执行文件分析链接重定位的过程
c语言·开发语言·risc-v
硬汉嵌入式9 天前
基于Rust构建的单片机Ariel RTOS,支持Cortex-M、RISC-V 和 Xtensa
单片机·rust·risc-v
MounRiver_Studio9 天前
RISC-V IDE MRS2进阶分享(三):MRS语言服务器
ide·mcu·risc-v·嵌入式开发
加强洁西卡9 天前
【RISC-V】解决链接器加入全局变量优化后操作系统无法启动的问题
risc-v
MounRiver_Studio9 天前
RISC-V IDE MRS2进阶分享(四):CH32H417双核芯片项目开发
ide·mcu·risc-v·嵌入式开发
加强洁西卡10 天前
【RISC-V】区分加载地址、链接地址、运行地址
risc-v
飞凌嵌入式11 天前
1块集成了4核Cortex-A7高性能CPU、1颗RISC-V MCU、多种高速总线、还兼容树莓派的T153低成本开发板
linux·arm开发·嵌入式硬件·risc-v