RISC-V 是一种模块化、开源的指令集架构(ISA),其设计注重简洁性和灵活性。RISC-V 规定了 32 个通用寄存器,每个寄存器宽度与处理器的字长一致(RV32 为 32 位,RV64 为 64 位,RV128 为 128 位)。这些寄存器支持整数计算、地址运算以及数据传递,是 CPU 操作的核心。
1. 通用寄存器列表与功能
RISC-V 使用固定编号的寄存器,并为每个寄存器分配了明确的名称和推荐用途。以下是通用寄存器的详细列表及其功能说明:
| 编号 | 寄存器名称 | 别名 | 功能描述 |
|---|---|---|---|
| x0 | zero | 零寄存器 | 常量 0,始终为零,用于立即值运算、数据清零或舍弃计算结果 |
| x1 | ra | 返回地址 | 存储函数调用返回地址,子程序结束后跳转到该地址 |
| x2 | sp | 堆栈指针 | 指向堆栈顶,用于函数调用和局部变量管理 |
| x3 | gp | 全局指针 | 用于存储全局变量的基地址 |
| x4 | tp | 线程指针 | 指向线程局部存储区域(TLS),支持多线程应用 |
| x5 | t0 | 临时寄存器 | 用于短期存储临时值,不需保证跨函数调用的值不变 |
| x6 | t1 | 临时寄存器 | 用于短期存储临时值 |
| x7 | t2 | 临时寄存器 | 用于短期存储临时值 |
| x8 | s0 / fp | 保存寄存器 | 保存重要值,跨函数调用保持不变;也可作为帧指针(frame pointer) |
| x9 | s1 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x10 | a0 | 参数寄存器 | 函数的第一个参数;也用作返回值存储寄存器 |
| x11 | a1 | 参数寄存器 | 函数的第二个参数;也用作返回值存储寄存器 |
| x12 | a2 | 参数寄存器 | 函数的第三个参数 |
| x13 | a3 | 参数寄存器 | 函数的第四个参数 |
| x14 | a4 | 参数寄存器 | 函数的第五个参数 |
| x15 | a5 | 参数寄存器 | 函数的第六个参数 |
| x16 | a6 | 参数寄存器 | 函数的第七个参数 |
| x17 | a7 | 参数寄存器 | 函数的第八个参数;也用于系统调用号的传递 |
| x18 | s2 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x19 | s3 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x20 | s4 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x21 | s5 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x22 | s6 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x23 | s7 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x24 | s8 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x25 | s9 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x26 | s10 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x27 | s11 | 保存寄存器 | 保存重要值,跨函数调用保持不变 |
| x28 | t3 | 临时寄存器 | 用于短期存储临时值 |
| x29 | t4 | 临时寄存器 | 用于短期存储临时值 |
| x30 | t5 | 临时寄存器 | 用于短期存储临时值 |
| x31 | t6 | 临时寄存器 | 用于短期存储临时值 |
2. 寄存器功能分组
2.1 零寄存器 (x0)
-
始终为零,不可修改
-
主要用于:
1. 立即数计算(例如清空一个寄存器:add x1, x0, x0)2. 舍弃运算结果(例如:sw x1, 0(x0) 将值存入无效地址)
2.2 返回地址寄存器 (x1)
-
用于存储函数调用的返回地址
-
函数调用完成后,返回调用点
2.3 堆栈指针寄存器 (x2)
- 指向堆栈的顶端,动态调整以管理局部变量和函数调用栈
2.4 全局与线程指针 (x3, x4)
-
全局指针 (gp):指向全局变量存储的基地址
-
线程指针 (tp):指向线程局部存储(TLS)的基地址,支持多线程程序
2.5 参数与返回值寄存器 (x10 - x17)
-
a0 - a1:用于返回值;在函数调用中存储前两个参数
-
a2 - a7:用于存储额外的函数参数
2.6 保存寄存器 (x8, x9, x18 - x27)
-
适用于长期保存重要值,跨函数调用保持不变
-
调用方或被调用方负责保存和恢复这些寄存器的值
2.7 临时寄存器 (x5 - x7, x28 - x31)
-
短期存储中间值,不保证值在函数调用后保持不变
-
调用方无需保存这些寄存器
3. 示例
简单加法函数
# 函数:计算 a + b,并返回结果
example_function:
add a0, a0, a1 # a0 = a0 + a1
ret # 返回结果(存储在 a0 中)
3.1 进入示例
下载解压并进入示例目录
3.2 编译
make
3.3 运行
make run
运行后LOG如下
qemu-system-riscv64 -nographic -machine virt -m 128M -bios m_mode.bin -device loader,file=s_mode.bin,addr=0x80200000 -kernel s_mode.elf
_____ ____ _____
/ ____| _ \_ _|
| (___ | |_) || |
\ \___ \| _ < | |
____) | |_) || |_
|_|_____/|____/_____|
example_function result: 5
详见请参考文档:实验环境搭建。