(1)在编写汇编代码时,使用寄存器的ABI名字,一般不直接使用寄存器的编号;
(2)x0-x31是用来做整形运算的寄存器,f0-f31是用来做浮点数运算的寄存器;RISC-V一定有x0-x31寄存器,但是不一定有f0-f31寄存器,这要看支不支持浮点数运算;
(3)保存者:调用者保存就是在函数跳转前要保存的寄存器,被调用者保存就是在函数执行过程中要使用该寄存器必须将原来的值保存到栈中,在函数返回前要恢复;
(8)x8寄存器除了作为保存数据的寄存器s0,还可以作为栈指针FP。作为栈指针FP时,保存的是栈底,用于栈回溯,就是gdb调试看到的函数调用关系,在《RISC-V 体系结构编程与实战》的4.3节有介绍;
(9)x0寄存器是零寄存器,寄存器的永远是0,这是硬件决定的,读x0寄存器的值永远是0,写x0寄存器则没有效果;
(1)不作为FP:若在编译时,GCC使用"-fomit-frame-pointer"编译选项,则s0不会被作为FP, 这样能够避免保存,设置和恢复帧指针的指令,提高程序性能,同时对许多函数提供一个额外的寄存器。但是在大多数机器上将无法调试,因为没法栈回溯;
(2)作为FP: 若在编译时,GCC使用"-fno-omit-frame-pointer"编译选项,则s0被作为FP,可以进行栈回溯,方便调试,会降低程序性能;
模式 | 功能 |
---|---|
M(Machine)模式 | 具有对机器的全部访问权限,通常运行SBI |
S(system)模式 | 系统模式,通常运行uboot和kernel |
U(user)模式 | 用户模式,应用程序运行在此模式 |
字段 | 含义 |
---|---|
opcode | 指令操作码,说明该条指令时什么类型指令 |
rd | 目标寄存器 |
funct3 | 功能码,进一步区分指令。比如CSR指令还细分为CSRRW、CSRRS等 |
rs1 | 源操作数 |
csr | CSR编码,也就是系统寄存器的编码 |
(1)访问系统寄存器需要通过CSR指令,上面是CSR指令的编码格式;
(2)系统寄存器的编码是12bit,对应CSR指令里的csr字段;
bit数 | 含义 |
---|---|
bit[11:10] | 表示系统寄存器的读写属性:0b11表示只读,其余表示可读可写 |
bit[9:8] | 表示允许访问该系统寄存器的处理器模式:0b00表示U模式,0b01表示S模式,0b10表示HS/VS,0b11表示M模式 |
(1)从地址空间映射可以指定,部分地址已经被RISC-V体系结构占用,用作固定功能系统寄存器的地址,还有部分地址是在RISC-V体系结构中没有定义的,用户在设计RISC-V架构芯片时可以自行增加系统寄存器;
(2)《RISC-V 体系结构编程与实战》的1.3节有介绍;
(1) 通用寄存器:寄存器的功能没有提前定义,是给编写代码的程序员使用的,具体寄存器里保存的数据是什么含义,是由编写代码的程序员决定;
(2)系统寄存器:和处理器模式相关的寄存器,寄存器的每个bit都已经提前定义好,程序员只能按照规则来操作系统寄存器。比如:M、S、U各个模式下的系统寄存器,每个寄存器的每个bit都已经定义好了含义;
上一篇:MySQL从入门到快速上手