Menu Close

RISC-V RV32I 指令: lui,auipc,addi,slti,sltiu,xori,ori,andi

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

该指令将设置寄存器x5的高20位为0x12345,并将低12位设置为零。

auipc

Add Upper Immediate to PC

将一个20位的立即数(常数)加到下一条指令的地址中。然后将结果存储在目标寄存器中,通常用于生成32位的绝对地址。

31-27 26-25 24-20 19-15 14-12 11-7 6-2 1-0
imm[31:12] rd 00101 11
Format
auipc rd,imm
Description
构建相对于程序计数器的地址并使用U类型格式。AUIPC从20位的U-immediate中形成32位的偏移,将最低12位填充为零,将这个偏移加到程序计数器,然后将结果放入寄存器rd。
Implementation
x[rd] = pc + sext(immediate[31:12] << 12)

例如,如果你想将立即数 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 中。

 

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in RISC-V教程

Related Posts