RV32I, RV64I Instructions
- opcode :指令操作码
- imm:立即数
- func3和funct7:代表指令对应的功能
- rs1:源寄存器1
- rs2:源寄存器2
- rd:目标寄存器(RSIC-V 一个指令可以提供三个寄存器操作)
lui
“Load Upper Immediate”(LUI)是RISC-V汇编语言中的一条指令。它用于将一个立即数(常数)加载到一个寄存器的高20位。寄存器的低12位被设置为零。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[31:12] | rd | 01101 | 11 |
- 格式:
-
lui rd,imm
- 描述:
-
构建32位常数并使用U类型格式。LUI将U-immediate值放置在目标寄存器rd的前20位,将最低12位填充为零。
- Implementation
-
x[rd] = sext(immediate[31:12] << 12)
例如,如果你想将立即数0x12345
加载到寄存器x5
中,相应的RISC-V汇编指令将是:
LUI x5, 0x12345
例如,如果你想将立即数 0x12345
加到程序计数器并将结果存储在寄存器 x6
中,对应的RISC-V汇编指令将是:
AUIPC x6, 0x12345
该指令将立即数左移12位后加到程序计数器,然后将结果存储在寄存器 x6
中。x6
的最低12位将填充为零。
addi
“ADDI” 是 RISC-V 汇编语言中的指令,代表 “Add Immediate”,用于将一个立即数(常数)加到一个寄存器的值上。
在 RISC-V 汇编中,ADDI 的语法通常如下:
add immediate
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 000 | rd | 00100 | 11 |
- 格式
-
addi rd,rs1,imm
- 描述
-
“ADDI” 指令将符号扩展的12位立即数加到寄存器
rs1
中。算术溢出会被忽略,结果只是结果的低 XLEN 位。ADDI rd, rs1, 0
用于实现MV rd, rs1
汇编伪指令。 - Implementation
-
x[rd] = x[rs1] + sext(immediate)
例如,如果你想将寄存器 x1
中的值与立即数 5
相加,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
ADDI x2, x1, 5
这个指令将寄存器 x1
中的值加上立即数 5
,并将结果存储在寄存器 x2
中。
slti
set less than immediate
“SLTI” 是 RISC-V 汇编语言中的指令,代表 “Set Less Than Immediate”,用于将一个寄存器的值与一个立即数进行有符号比较。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 010 | rd | 00100 | 11 |
- 格式
-
slti rd,rs1,imm
- 描述
- 如果将寄存器
rs1
视为带符号数,并且其值小于符号扩展的立即数时,将值1
存入寄存器rd
中;否则,将值0
存入rd
。 -
rd
:目标寄存器,存储比较结果(1 表示 true,0 表示 false)。rs1
:源寄存器,表示要进行比较的数。immediate
:一个有符号的立即数,即用于比较的常数。
- Implementation
-
x[rd] = x[rs1] <s sext(immediate)
例如,如果你想判断寄存器 x1
中的值是否小于立即数 10
,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
SLTI x2, x1, 10
这个指令将比较寄存器 x1
中的值是否小于立即数 10
,如果是,则寄存器 x2
中的值将被设置为 1
,否则为 0
。
sltiu
“SLTIU” 是 RISC-V 汇编语言中的指令,代表 “Set Less Than Immediate Unsigned”,用于将一个寄存器的无符号值与一个立即数进行比较。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 011 | rd | 00100 | 11 |
- 格式
-
sltiu rd,rs1,imm
- 描述
-
如果将寄存器
rs1
视为无符号数,并且其值小于立即数时,将值1
存入寄存器rd
中;否则,将值0
存入rd
。rd
:目标寄存器,存储比较结果(1 表示 true,0 表示 false)。rs1
:源寄存器,表示要进行比较的无符号数。immediate
:一个无符号的立即数,即用于比较的常数。
- Implementation
-
x[rd] = x[rs1] <u sext(immediate)
例如,如果你想判断寄存器 x1
中的无符号值是否小于立即数 10
,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
LTIU x2, x1, 10
这个指令将比较寄存器 x1
中的无符号值是否小于立即数 10
,如果是,则寄存器 x2
中的值将被设置为 1
,否则为 0
。
xori
“XORI” 是 RISC-V 汇编语言中的指令,代表 “XOR Immediate”,用于将一个寄存器的值与一个立即数进行异或操作。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 100 | rd | 00100 | 11 |
- 格式
-
xori rd,rs1,imm
rd
:目标寄存器,存储异或操作的结果。rs1
:源寄存器,表示要进行异或操作的数。immediate
:一个立即数,即用于异或操作的常数。
- 描述
-
“XORI” 指令在寄存器
rs1
和符号扩展的12位立即数之间执行按位异或操作,并将结果存储在寄存器rd
中。请注意,“XORI rd, rs1, -1” 执行寄存器rs1
的按位逻辑反转(汇编伪指令 NOT rd, rs)。 - Implementation
-
x[rd] = x[rs1] ^ sext(immediate)
例如,如果你想将寄存器 x1
中的值与立即数 0x55
进行异或操作,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
XORI x2, x1, 0x55
这个指令将执行 x2 = x1 ^ 0x55
,即将寄存器 x1
中的值与 0x55
进行异或操作,并将结果存储在寄存器 x2
中。
ori
“ORI” 是 RISC-V 汇编语言中的指令,代表 “OR Immediate”,用于将一个寄存器的值与一个立即数进行按位或操作。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 110 | rd | 00100 | 11 |
- 格式
-
ori rd,rs1,imm
-
rd
:目标寄存器,存储按位或操作的结果。rs1
:源寄存器,表示要进行按位或操作的数。immediate
:一个立即数,即用于按位或操作的常数。
- 描述
-
“ORI” 指令在寄存器
rs1
和符号扩展的12位立即数之间执行按位或操作,并将结果存储在寄存器rd
中。 - Implementation
-
x[rd] = x[rs1] | sext(immediate)
例如,如果你想将寄存器 x1
中的值与立即数 0xFF
进行按位或操作,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
ORI x2, x1, 0xFF
这个指令将执行 x2 = x1 | 0xFF
,即将寄存器 x1
中的值与 0xFF
进行按位或操作,并将结果存储在寄存器 x2
中。
andi
“ANDI” 是 RISC-V 汇编语言中的指令,代表 “AND Immediate”,用于将一个寄存器的值与一个立即数进行按位与操作。
31-27 | 26-25 | 24-20 | 19-15 | 14-12 | 11-7 | 6-2 | 1-0 |
imm[11:0] | rs1 | 111 | rd | 00100 | 11 |
- 格式
-
andi rd,rs1,imm
rd
:目标寄存器,存储按位与操作的结果。rs1
:源寄存器,表示要进行按位与操作的数。immediate
:一个立即数,即用于按位与操作的常数。
- 描述
-
“ANDI” 指令在寄存器
rs1
和符号扩展的12位立即数之间执行按位与操作,并将结果存储在寄存器rd
中。 - Implementation
-
x[rd] = x[rs1] & sext(immediate)
例如,如果你想将寄存器 x1
中的值与立即数 0x0F
进行按位与操作,并将结果存储在寄存器 x2
中,相应的 RISC-V 汇编指令将是:
ANDI x2, x1, 0x0F
这个指令将执行 x2 = x1 & 0x0F
,即将寄存器 x1
中的值与 0x0F
进行按位与操作,并将结果存储在寄存器 x2
中。