RISC-V通用寄存器及函数调用规范

Creative Commons
本作品采用知识共享署名

本文说明RISC-V通用寄存器的使用方法。

RV32I通用寄存器寄存器

通用寄存器共计32个

Register ABI Name Saver 作用
x0 zero 硬编码恒为0
x1 ra Caller 函数调用的返回地址
x2 sp Callee 堆栈指针
x3 gp 全局指针
x4 tp 线程指针
x5-7 t0-2 Caller 临时寄存器/
x8 s0/fp Callee 保存寄存器/帧指针
x9 s1 Callee 保存寄存器
x10-11 a0-1 Caller 函数参数/返回值
x12-17 a2-7 Caller 函数参数
x18-27 s2-11 Callee 保存寄存器
x28-31 t3-6 Caller 临时寄存器

Caller 由调用者保存

Callee 由被调用者保存

函数调用规范

函数调用六个阶段:

  1. 将参数存储到函数可以访问的地址
  2. 跳转到函数开始位置
  3. 获取函数需要的局部资源,按需保存寄存器
  4. 执行函数中的指令
  5. 将返回值存储到调用者能够访问的位置,恢复寄存器,释放局部资源
  6. 返回到调用函数的位置

函数调用过程中可以直接改写的寄存器叫临时寄存器(t0~t6)。在调用过程中不能直接改写的寄存器值得叫保存寄存器(s0~s11),函数调用过程中如果要使用s0~s11,需要由被调用函数进行保护,保证在函数调用前后内部值不变。

PC寄存器

在risc-v中pc寄存器是专用寄存器,只有分支指令能够对其进行修改。

参考

http://crva.io/documents/RISC-V-Reader-Chinese-v2p1.pdf
https://github.com/riscv/riscv-isa-manual/releases