RISC-V调用约定与栈帧详解
1. RISC-V调用约定概述
在RISC-V架构中,调用约定(Calling Convention)定义了函数调用时参数传递、寄存器使用和栈管理的规则。理解这些规则对于编写汇编代码和进行系统级编程至关重要。
RISC-V有两种主要的调用约定:
- RVG调用约定:用于支持标准扩展(如浮点运算)的实现
- 软浮点调用约定:用于不支持浮点硬件单元的实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 寄存器使用规范
2.1 寄存器分类与用途
RISC-V寄存器在函数调用中扮演不同角色:
| 寄存器 | ABI名称 | 用途 | 保存者 |
|---|---|---|---|
| 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 | 保存寄存器 |
