RISC-V基础之函数调用(一)简单的函数调用(包含实例)

高级语言支持函数(也称为过程或子程序)来重用通用的代码,以及使程序更加模块化和可读。函数可以有输入,称为参数,和输出,称为返回值。函数应该计算返回值,并且不产生其他意外的副作用。

在一个函数调用另一个函数时,调用者(caller)和被调用者(callee)必须约定好在哪里放置参数和返回值。在RISC-V程序中,惯例是调用者在进行函数调用前将最多八个参数放在寄存器a0到a7中,而被调用者在完成前将返回值放在寄存器a0中。遵循这个惯例,两个函数都知道在哪里找到参数和返回值,即使调用者和被调用者是由不同的人编写的。

被调用者不能干扰调用者的行为。这意味着被调用者必须知道在完成后返回到哪里,而且不能破坏调用者需要的任何寄存器或内存。调用者在使用跳转并链接(jump and link)指令(jal)跳转到被调用者时,同时将返回地址存储在返回地址寄存器ra中。被调用者不能覆盖任何架构状态或内存,因为这些是调用者依赖的。具体来说,被调用者必须保持保存寄存器(s0−s11)、返回地址(ra)和堆栈(一部分内存用于临时变量)不变。

如上实例:

上图展示了主函数(main)调用简单函数(simple)的过程。main是调用者,simple是被调用者。simple函数没有输入参数,也没有返回值,它只是返回给调用者。在 Example中,每条RISC-V指令的左边给出了示例指令地址。jal和jr ra是函数调用和返回所必需的两条指令。主函数通过执行jal simple来调用simple函数,这个指令做了两件事:它跳转到目标指令的地址,即simple所在的地址(0x0000051C),并且把返回地址,即jal后面的指令的地址(在这个例子中是0x00000304)存储在返回地址寄存器(ra)中。程序员可以指定哪个寄存器被写入返回地址,但默认是ra。simple函数立即通过执行jr ra来返回,这个指令跳转到ra寄存器中保存的指令地址。主函数然后继续在这个地址(0x00000304)执行

RISC-V的约定是,函数使用a0到a7这八个寄存器来传递输入参数,其中a0是最左边的参数,a7是最右边的参数。函数使用a0寄存器来返回输出值。如果函数有多于八个的输入参数,那么多余的参数会被放在栈上。

上例展示了一个名为diffofsums的函数,它接收四个输入参数,并返回一个输出值。result是一个局部变量,我们选择把它保存在s3寄存器中。

根据RISC-V的约定,调用函数(main)在调用被调用函数(diffofsums)之前,把函数参数从左到右放入输入寄存器a0到a7中。被调用函数(diffofsums)把返回值存储在返回寄存器a0中。当函数返回时,调用函数(main)可以从a0中读取返回值。

相关推荐
ChipCamp10 天前
ChipCamp探索系列 -- 1. Soft-Core RISC-V on FPGA
fpga开发·verilog·risc-v
ChipCamp12 天前
Chisel芯片开发入门系列 -- 18. CPU芯片开发和解释8(流水线架构的代码级理解)
开发语言·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
思尔芯S2C15 天前
Cost-Effective and Scalable: A Smarter Choice for RISC-V Development
fpga开发·risc-v·soc设计·prototyping
ChipCamp17 天前
Chisel芯片开发入门系列 -- 14. CPU芯片开发和解释4(Load/Store指令再探)
arm开发·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
芝士爱沙拉20 天前
智能落地扇方案:青稞RISC-V电机 MCU一览
单片机·嵌入式硬件·risc-v·电机驱动
OpenAnolis小助手25 天前
RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验
开源·龙蜥社区·risc-v·datacenter sig·龙蜥社区risc-v sig
月光技术杂谈1 个月前
《RISC-V 导论:设计与实践》开源课件(附下载链接)
开源·risc-v·课件
月光技术杂谈1 个月前
上海RISC-V峰会-香山开源RISC-V CPU随想随记
verilog·risc-v·chisel·vhdl·香山·开源cpu·xiangshan
随风ada1 个月前
Windows、macOS、liunx下使用qemu搭建riscv64/linux
linux·windows·ubuntu·macos·golang·qemu·risc-v
openKylin1 个月前
填补空白!openKylin率先完成RISC-V商业打印驱动全适配
risc-v