Riscv手册
首先下载手册:文件下载----中国开放指令生态(RISC-V)联盟
从这个页面下载riscv-spec-v2.1中文版
也可以下载中科大的这本:RISC-V手册
Riscv32指令集包括基础指令集和一些扩展指令集,比如在ESP32C3技术手册中,写到ESP32C3的ESP-RISC-V-CPU的介绍:ESP-RISC-V CPU 是基于RISC-VISA的32位内核,包括基本整数(I),乘法/除法(M)和压缩(C)标准扩展。
也就是ESP-RISC-V CPU这款CPU包含基本整数集I,乘法/除法集M和压缩标准扩展指令集C
汇编器向RISCV ISA中增加了60条伪指令,是的代码更易于读写,并且不增加硬件开销。
基本指令格式
在基本ISA中,有四种核心指令格式:R/I/S/U,所有的指令都是固定32位长度,并且在存储器中必须在四字节边界对齐。当发生一个条件分支或者无条件转移而且目标地址不是对齐到4字节时,将会产生一个指令地址不对齐的异常。
RISC-V四种指令格式
RISC-V有四种指令格式:R、I、S、U
R类指令:功能码与寄存器
I类指令:立即数操作
S类指令:存储与加载
U类指令:无条件跳转
按照高位到低位的顺序排列的RISC-V四种指令格式的介绍:
1. R型指令(寄存器类型)
- 格式(高位到低位):
funct7
(7位):功能码的一部分,用于区分不同的寄存器操作。rs2
(5位):第二个源寄存器索引。rs1
(5位):第一个源寄存器索引。funct3
(3位):功能码的另一部分,与funct7
共同确定具体操作。rd
(5位):目标寄存器索引。opcode
(7位):操作码,用于区分不同类型的指令。
- 特点:所有操作数都是寄存器,没有立即数。这种指令格式适用于需要两个源寄存器和一个目标寄存器的操作,如加法、减法、逻辑运算等。
-
示例:
ADD rd, rs1, rs2
(将rs1
和rs2
的值相加,结果存储在rd
中)。
2. I型指令(立即数类型)
- 格式(高位到低位):
imm
(12位,但通常分为高5位和低7位两部分在指令中编码):立即数值,用于算术运算或加载操作的偏移量。rs1
(5位):源寄存器索引。funct3
(3位):功能码,用于区分不同的立即数操作。rd
(5位):目标寄存器索引。opcode
(7位):操作码。
-
特点:有一个源寄存器、一个立即数和一个目标寄存器。这种指令格式适用于需要一个源寄存器、一个立即数和一个目标寄存器的操作,如算术运算、逻辑运算以及加载操作等。
-
示例:
ADDI rd, rs1, imm
(将rs1
的值与立即数imm
相加,结果存储在rd
中)。
3. S型指令(存储类型)
- 格式(高位到低位):
imm[11:5]
(7位):偏移量的高7位(立即数的一部分)。rs2
(5位):源寄存器索引,存储的数据来源。rs1
(5位):基地址寄存器索引,用于计算存储地址。funct3
(3位):功能码,用于区分不同的存储操作。imm[4:0]
(5位):偏移量的低5位(与前面的7位组成12位偏移量)。opcode
(7位):操作码。
-
特点:有两个源寄存器(一个作为基地址寄存器,另一个作为源数据寄存器)和一个立即数作为偏移量。这种指令格式用于将源寄存器的值存储到基地址寄存器加上偏移量所指定的内存地址中。
-
示例:
SW rs2, imm(rs1)
(将rs2
的值存储到rs1 + imm
地址的内存位置)。
4. B型指令(分支类型)
- 格式(高位到低位):
imm[12|10:5]
(1位和6位,共7位,但编码时分散在指令中):偏移量的一部分,用于计算跳转地址。rs2
(5位):第二个源寄存器索引,通常用于条件比较。rs1
(5位):第一个源寄存器索引,通常与rs2
一起用于条件比较。funct3
(3位):功能码,用于区分不同的分支操作。imm[4:1|11]
(4位和1位,共5位,与前面的7位组成12位偏移量):偏移量的另一部分。opcode
(7位):操作码。
- 特点:有两个源寄存器和一个立即数作为偏移量。这种指令格式用于根据两个源寄存器的值是否满足某个条件来决定是否跳转到当前指令地址加上偏移量所指定的目标地址。
- 示例:
BEQ rs1, rs2, imm
(如果rs1
等于rs2
,则跳转到当前指令地址加上imm
的目标地址)。
需要注意的是,B型指令的立即数(偏移量)编码比较特殊,它分散在指令的多个位置。这是为了优化指令的编码效率,使得分支指令能够尽可能紧凑地表示。
调试
RISCV伪指令学习
RISC-V伪指令简化的详细解释:
-
RISC-V指令集的设计理念:
- RISC-V的设计理念是简化指令集,通过减少指令的复杂度和数量,提高指令的执行效率。这种设计理念有助于实现高效的处理器设计,降低处理器的功耗,并提高处理器的性能1。
-
伪指令的作用:
- 伪指令在汇编语言中通常用于表示那些不是处理器直接执行的指令,而是由汇编器在汇编过程中进行解释和转换的指令。它们可以简化程序的编写,使汇编代码更加易读和易于维护。
- 在RISC-V中,伪指令被用来进一步简化指令集,通过提供更高层次的抽象,使得程序员可以使用更简洁的指令来完成复杂的操作。
-
伪指令的简化:
- RISC-V的伪指令经过精心设计,以简化处理器的实现和指令的执行。这些伪指令在汇编过程中被转换成处理器能够直接执行的基本指令,从而减少了指令的数量和复杂度。
- 通过简化伪指令,RISC-V指令集保持了其简洁性和清晰性,这有助于处理器的高效实现和指令的快速执行。
-
简化伪指令的好处:
- 提高指令的执行效率:简化的伪指令可以减少处理器执行指令所需的时间和资源,从而提高指令的执行效率。
- 降低处理器的功耗:简化的指令集有助于减少处理器的功耗,因为处理器在执行简化的指令时需要消耗更少的能量。
- 促进处理器的创新和发展:RISC-V的开源性和简洁性吸引了大量的开发者和研究人员。通过简化伪指令,RISC-V为处理器的创新和发展提供了更多的可能性和空间。
综上所述,RISC-V伪指令的简化是为了进一步精简RISC-V指令集,提高指令的执行效率和处理器的性能。这种简化符合RISC-V的设计理念,即简化指令集以提高处理器的效率和性能。