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 由被调用者保存
函数调用规范
函数调用六个阶段:
- 将参数存储到函数可以访问的地址
- 跳转到函数开始位置
- 获取函数需要的局部资源,按需保存寄存器
- 执行函数中的指令
- 将返回值存储到调用者能够访问的位置,恢复寄存器,释放局部资源
- 返回到调用函数的位置
函数调用过程中可以直接改写的寄存器叫临时寄存器(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