资源1: RISC-V China – RISC-V International
资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture
资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation
在讨论RISC-V或任何处理器架构时,区分 非特权指令集架构(Unprivileged ISA)和 特权指令集架构(Privileged ISA)是很重要的。这两种类型的指令集反映了不同的使用场景和权限级别,对于理解现代计算机系统的运作方式至关重要。
非特权指令集架构包含了处理器在用户模式下可执行的指令集。这些指令对操作系统的内核模式和直接访问硬件资源的能力有限制。非特权ISA设计用于执行应用程序代码,提供了如算术运算、数据传输、逻辑操作和控制流等基本操作的指令。
为应用程序提供执行其功能所需的基本指令集,同时限制对系统资源的直接访问,以保护系统的安全性和稳定性。
非特权指令通常包括操作数的算术和逻辑操作、访问内存的加载和存储指令、分支和跳转指令等。
通过限制非特权指令不能直接执行某些影响系统整体行为的操作(如直接管理硬件资源),增加了操作系统的安全性。
特权指令集架构包含了处理器在内核模式或其他特权模式下可执行的指令集。这些指令允许直接访问和控制硬件资源,如内存管理单元(MMU)、中断控制和设备I/O。特权ISA对于操作系统的功能,如进程调度、内存管理和硬件抽象层的实现至关重要。
提供必要的指令和控制机制,以实现操作系统的核心功能,包括资源管理、安全隔离和硬件抽象。
特权指令集包括控制寄存器访问、设置和清除特权级别、管理中断和异常、控制内存访问权限等操作。
由于特权指令允许执行对系统安全和稳定性有深远影响的操作,因此它们的使用严格限制于操作系统内核或其他信任的系统软件。
非特权和特权指令集共同定义了处理器的功能和能力,为不同的软件层级提供了适当的执行权限。
主要在于执行权限和可访问的资源。非特权ISA为用户级应用提供基本操作,而特权ISA为系统级软件提供对硬件和关键系统资源的全面控制。
在RISC-V架构中,这种区分允许创建可扩展和安全的计算系统,能够适应从简单的嵌入式设备到复杂的多核服务器的广泛需求。通过这种方式,RISC-V既满足了对硬件直接控制的需要,又保障了系统的安全性和稳定性。
RISC-V的指令助记符是设计用来帮助人们更容易理解和记忆各种指令的简短代号。这些助记符通常反映了指令的操作类型、操作数和操作模式。下面列出了一些常见的RISC-V指令助记符的类别和示例:
ADD: 加法指令,执行两个寄存器的内容相加。
SUB: 减法指令,从一个寄存器的内容中减去另一个寄存器的内容。
MUL: 乘法指令,执行两个寄存器内容的乘法操作。
AND: 逻辑与操作,对两个寄存器的位进行逻辑与操作。
OR: 逻辑或操作,对两个寄存器的位进行逻辑或操作。
XOR: 逻辑异或操作,对两个寄存器的位进行逻辑异或操作。
NOT: 逻辑非操作,对寄存器的每一位进行逻辑非操作。
BEQ: 分支如果相等,如果两个寄存器的内容相等,则跳转到指定的代码位置。
BNE: 分支如果不等,如果两个寄存器的内容不相等,则跳转到指定的代码位置。
BLT: 分支如果小于,如果第一个寄存器的内容小于第二个寄存器的内容,则跳转到指定的代码位置。
BGE: 分支如果大于等于,如果第一个寄存器的内容大于等于第二个寄存器的内容,则跳转到指定的代码位置。
LW: 加载字,从内存中加载一个字到寄存器。
SW: 存储字,将寄存器的内容存储到内存中的指定位置。
LBU: 加载字节无符号,从内存中加载一个字节到寄存器,并将其视为无符号数。
SB: 存储字节,将寄存器的最低字节存储到内存中的指定位置。
JAL: 跳转并链接,跳转到指定的代码位置,并将返回地址保存到寄存器中。
JALR: 跳转并链接寄存器,通过寄存器指定的地址跳转,并将返回地址保存到寄存器中。
NOP: 无操作,这是一个不执行任何操作的指令,通常用于占位或延迟。
FENCE: 内存屏障,用于指令和内存操作的排序保证。
这些助记符是RISC-V指令集的一部分,它们代表了处理器可以执行的各种基本操作。了解这些基本的指令助记符有助于理解RISC-V程序的结构和功能。
在RISC-V指令集中,slt、slti、sltu 和 sltiu 是用于比较操作的指令,它们可以用于判断两个数的大小关系。下面是这四种指令的详细说明和示例:
指令格式: slt rd, rs1, rs2
功能: 如果寄存器 rs1 中的值小于寄存器 rs2 中的值,则将寄存器 rd 设置为1,否则设置为0。这里的比较是有符号数的比较。
示例: 假设寄存器 x5 的值为10,寄存器 x6 的值为20,则指令 slt x7, x5, x6 会将寄存器`x7`设置为1,因为10小于20。
指令格式: slti rd, rs1, imm
功能: 如果寄存器 rs1 中的值小于立即数 imm ,则将寄存器 rd 设置为1,否则设置为0。比较也是有符号数的比较。
示例: 假设寄存器 x5 的值为15,则指令 slti x7, x5, 20 会将寄存器 x7 设置为1,因为15小于20。
指令格式: sltu rd, rs1, rs2
功能: 如果寄存器 rs1 中的值(作为无符号数)小于寄存器 rs2 中的值(作为无符号数),则将寄存器 rd 设置为1,否则设置为0。