RISCV32的相关问题

RV32I 寄存器

为什么NEMU要给riscv32的寄存器提供名称?

riscv32架构下,cpu的32个通用寄存器定义在isa-def.h中。而关于其通用寄存器gpr的解释定义在下面的reg.c中。reg.c为RV32I 寄存器提供了可读性较好的ABI定义的寄存器名称。

RISC-V 32 的寄存器使用 ABI(Application Binary Interface,应用二进制接口)的名称的原因:

  1. 标准化函数调用
    • 使用 ABI 的命名(如 a0a7 表示参数寄存器,t0t6 表示临时寄存器等)明确了寄存器在函数调用中的用途。例如,函数参数通过 a0a7 传递,返回值通过 a0a1 返回,这种标准化便于程序员和编译器理解每个寄存器的用途,并统一函数调用的接口规则。
    • 在进行函数调用时,编译器能根据 ABI 规范安排寄存器,方便管理数据传递和调用栈,简化了函数调用流程。
  2. 跨平台和语言兼容性
    • ABI 名称建立了通用的接口和约定,使得不同编程语言和工具链(如编译器、链接器)能够基于同一规则协同工作。RISC-V 的 ABI 规范是跨平台的,即便在不同的操作系统和环境中,ABI 命名规则保持一致,确保代码的可移植性和兼容性。
    • 例如,编写汇编代码时,用 sp 表示栈指针,而不是 x2,这样代码的可读性和可维护性更高,也方便跨平台移植
  3. 提高可读性和可维护性
    • 相比直接使用 x0x31 的编号,ABI 名称(如 spra 等)更容易让程序员理解寄存器的用途。例如, sp 代表栈指针,ra 代表返回地址,s0s11 代表保存寄存器(函数调用中需要保存的数据),这使代码更具可读性。

ABI类似遥控器,简化了我们与硬件的交互难度。例如我们只需要知道这个遥控器(栈指针sp)的是调节风扇转速的功能(保存栈顶的地址),就可以与风扇(程序)交互。

CSR地址映射

CSR有关的命令中例如csrrwcsrrs

其中对于csr的地址编码是12位。在机器模式M下的一些CSR的地址分配情况如下:

更多信息可以访问The RISC-V Instruction Set Manual: Volume II 的2.2小节。

posted @ 2024-11-12 14:38  上山砍大树  阅读(8)  评论(0编辑  收藏  举报