跳到主要内容

1. RISC-V 指令格式

RISC-V 指令集包含六种基本指令格式:

  • R 型指令:用于寄存器-寄存器操作
  • I 型指令:用于短立即数和访存load操作
  • S 型指令:用于访存store操作
  • B 型指令:用于条件跳转操作
  • U 型指令:用于长立即数
  • J 型指令:用于无条件跳转

1.1 格式

1

1.2 字段说明

  • opcode(操作码)字段:位于指令编码Bit[6:0],用于指令的分类。
  • funct3和fiunct7(功能码)字段:常常与opcode字段结合在一起定义指令的操作功能。
  • rd字段:表示目标寄存器的编号,位于指令编码的Bi[11:7]。
  • rs1字段:表示第一源操作寄存器的编号,位于指令编码的Bit[19:15]。
  • rs2字段:表示第二源操作寄存器的编号,位于指令编码的Bit[24:20]。
  • imm:表示立即数。在RISC-V中使用的立即数大部分是符号扩展(sign-extended)的立即数。

2. R 型指令

2.1. 格式

R 型指令用于寄存器-寄存器操作,结构如下:

bit[31:25]bit[24:20]bit[19:15]bit[14:12]bit[11:7]bit[6:0]
funct7rs2rs1funct3rdopcode

2.2 字段说明:

  • opcode: 操作码,7 位
  • rd: 目的寄存器,5 位
  • funct3: 额外操作字段,3 位
  • rs1: 第一个源寄存器,5 位
  • rs2: 第二个源寄存器,5 位
  • funct7: 额外操作字段,7 位

2.3 示例

R 型指令主要用于加法、减法、移位和逻辑操作。

add a0, a1, a2 # 将寄存器 a1 和 a2 的值相加,结果存入寄存器 a0
sub a0, a1, a2 # 将寄存器 a1 的值减去寄存器 a2 的值,结果存入寄存器 a0
sll a0, a1, a2 # 将寄存器 a1 的值左移 a2 位,结果存入寄存器 a0(算术左移)
srl a0, a1, a2 # 将寄存器 a1 的值右移 a2 位,结果存入寄存器 a0(逻辑右移,不保留符号位)
xor a0, a1, a2 # 对寄存器 a1 和 a2 的值进行按位异或运算,结果存入寄存器 a0
and a0, a1, a2 # 对寄存器 a1 和 a2 的值进行按位与运算,结果存入寄存器 a0

3. I 型指令

3.1 格式

I 型指令包括立即数的运算和访存加载指令,具有以下结构:

bit[31:20]bit[19:15]bit[14:12]bit[11:7]bit[6:0]
imm[11:0]rs1funct3rdopcode

3.2 字段说明:

  • opcode: 操作码,7 位
  • rd: 目的寄存器,5 位
  • funct3: 操作字段,3 位
  • rs1: 第一个源寄存器,5 位
  • imm: 立即数,12 位

3.3 示例

I 型指令包括立即数运算和访存load操作。

addi a0, a1, 5 # a0 = a1 + 5
lw a0, 0(a1) # 将内存地址 a1+0 处的 32 位数据加载到 a0
lb a0, 0(a1) # 将内存地址 a1+0 处的 8 位数据加载到 a0

4. S 型指令

4.1 格式

S 型指令用于存储数据,具有以下结构:

bit[31:25]bit[24:20]bit[19:15]bit[14:12]bit[11:7]bit[6:0]
imm[11:5]rs2rs1funct3imm[4:0]opcode

4.2 字段说明

  • opcode: 操作码,7 位
  • rs1: 源寄存器,5 位
  • rs2: 第二个源寄存器,5 位
  • funct3: 操作字段,3 位
  • imm: 立即数,12 位(分为两部分)

4.3 示例

S 型指令用于将寄存器的值存储到内存。

sb x10, 0(x1) # 将 x10 的最低 8 位存储到 x1 地址处
sh x10, 0(x1) # 将 x10 的最低 16 位存储到 x1 地址处
sw x10, 0(x1) # 将 x10 的最低 32 位存储到 x1 地址处

5. B 型指令

5.1 格式

B 型指令用于条件跳转操作,具有以下结构:

bit [31:25]bit [24:20]bit [19:15]bit [14:12]bit [11:8]bit [7]bit [6:0]
imm[12]imm[10:5]rs2rs1funct3imm[4:1]opcode

5.2 字段说明

  • opcode: 操作码,7 位
  • rs1: 第一个源寄存器,5 位
  • rs2: 第二个源寄存器,5 位
  • funct3: 操作字段,3 位
  • imm: 立即数,12 位(用于计算跳转偏移)

5.3 示例

B 型指令用于条件跳转。

beq a1, a2, Label # 如果 a1 == a2,则跳转到 Label
bne a1, a2, Label # 如果 a1 != a2,则跳转到 Label
blt a1, a2, Label # 如果 a1 < a2,则跳转到 Label
bgt a1, a2, Label # 如果 a1 > a2,则跳转到 Label

6. U 型指令

6.1 格式

U 型指令用于长立即数操作,具有以下结构:

bit [31:12]bit [11:7]bit [6:0]
imm[31:12]rdopcode

6.2 字段说明

  • opcode: 操作码,7 位
  • rd: 目的寄存器,5 位
  • imm: 立即数,20 位(只保留高 20 位)

6.3 示例

U 型指令主要用于加载高 20 位的立即数。

lui x10, 0x12345 # 将高 20 位立即数加载到 x10 寄存器

7. J 型指令

7.1 格式

J 型指令用于无条件跳转,具有以下结构:

bit [31:12]bit [11]bit [10:1]bit [20]bit [19:12]bit [11:7]bit [6:0]
imm[19:12]imm[11]imm[10:1]imm[20]rdopcode

7.2 字段说明

  • opcode: 操作码,7 位
  • rd: 目的寄存器,5 位
  • imm: 立即数,21 位

7.3 示例

J 型指令用于无条件跳转。

jal ra, Label # 跳转到 Label 处,并保存返回地址到 ra 寄存器
jalr ra, 40(x10) # 跳转到 x10+40 地址处,并保存返回地址到 ra 寄存器