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 开始。

相关推荐
dozenyaoyida15 小时前
LittleFS 嵌入式文件系统机制拆解与某 RISC-V MCU 实测配置
单片机·嵌入式·文件系统·risc-v·littlefs·flash存储
hongmai66688819 小时前
把玩ESP8684-WROOM-04C-H4X:一颗耐高温的RISC-V小钢炮
笔记·单片机·嵌入式硬件·物联网·risc-v
硅农程序猿10 天前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
hongmai66688814 天前
ESP32-WROVER-B-N8R8:8MB PSRAM加持的经典双核模组,现在还值得选吗?
单片机·嵌入式硬件·物联网·智能路由器·risc-v
hongmai66688815 天前
GK7205V300芯片深度解析:H.265低功耗视觉主控,助力安防监控高效选型
arm开发·嵌入式硬件·物联网·智能家居·h.265·risc-v
2301_8059629316 天前
在昉星光2(RISC-V)上构建每日短视频自动生成器
音视频·risc-v
hongmai66688817 天前
聊聊ESP32-C3-WROOM-02-N8这颗8MB Flash的RISC-V模组
笔记·嵌入式硬件·物联网·智能路由器·risc-v
hongmai66688818 天前
耐高温小钢炮:ESP32-C3-MINI-1U-H4模组选型分享
笔记·单片机·嵌入式硬件·物联网·risc-v
国科安芯20 天前
卫星星务计算机数据管理中SEU容错机制的技术实现研究——以AS32S601存储器ECC架构为例
网络·单片机·算法·fpga开发·架构·云计算·risc-v
QYR-分析21 天前
RISC-V AI加速器SoC行业研究报告:开放架构赋能AI芯片,高增赛道开启国产化新机遇
人工智能·架构·risc-v