跳到主要内容

RISC-V 是一种模块化、开源的指令集架构(ISA),其设计注重简洁性和灵活性。RISC-V 规定了 32 个通用寄存器,每个寄存器宽度与处理器的字长一致(RV32 为 32 位,RV64 为 64 位,RV128 为 128 位)。这些寄存器支持整数计算、地址运算以及数据传递,是 CPU 操作的核心。

1. 通用寄存器列表与功能

RISC-V 使用固定编号的寄存器,并为每个寄存器分配了明确的名称和推荐用途。以下是通用寄存器的详细列表及其功能说明:

编号寄存器名称别名功能描述
x0zero零寄存器常量 0,始终为零,用于立即值运算、数据清零或舍弃计算结果
x1ra返回地址存储函数调用返回地址,子程序结束后跳转到该地址
x2sp堆栈指针指向堆栈顶,用于函数调用和局部变量管理
x3gp全局指针用于存储全局变量的基地址
x4tp线程指针指向线程局部存储区域(TLS),支持多线程应用
x5t0临时寄存器用于短期存储临时值,不需保证跨函数调用的值不变
x6t1临时寄存器用于短期存储临时值
x7t2临时寄存器用于短期存储临时值
x8s0 / fp保存寄存器保存重要值,跨函数调用保持不变;也可作为帧指针(frame pointer)
x9s1保存寄存器保存重要值,跨函数调用保持不变
x10a0参数寄存器函数的第一个参数;也用作返回值存储寄存器
x11a1参数寄存器函数的第二个参数;也用作返回值存储寄存器
x12a2参数寄存器函数的第三个参数
x13a3参数寄存器函数的第四个参数
x14a4参数寄存器函数的第五个参数
x15a5参数寄存器函数的第六个参数
x16a6参数寄存器函数的第七个参数
x17a7参数寄存器函数的第八个参数;也用于系统调用号的传递
x18s2保存寄存器保存重要值,跨函数调用保持不变
x19s3保存寄存器保存重要值,跨函数调用保持不变
x20s4保存寄存器保存重要值,跨函数调用保持不变
x21s5保存寄存器保存重要值,跨函数调用保持不变
x22s6保存寄存器保存重要值,跨函数调用保持不变
x23s7保存寄存器保存重要值,跨函数调用保持不变
x24s8保存寄存器保存重要值,跨函数调用保持不变
x25s9保存寄存器保存重要值,跨函数调用保持不变
x26s10保存寄存器保存重要值,跨函数调用保持不变
x27s11保存寄存器保存重要值,跨函数调用保持不变
x28t3临时寄存器用于短期存储临时值
x29t4临时寄存器用于短期存储临时值
x30t5临时寄存器用于短期存储临时值
x31t6临时寄存器用于短期存储临时值

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

详见请参考文档:实验环境搭建。