ori
lyszt.net 更详细地介绍了 ori 和其他 RISC-V 指令。
编码格式
R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode
描述
ori 执行与常量的按位或运算。它与 or 的关系,正如 andi 与 and 的关系。i 表示立即数(immediate),即编码在指令中的固定值。ori 将一个寄存器与该常量进行或运算,而不是对两个寄存器进行或运算。OR 规则不变。结果中某一位为 1,当且仅当该位上任一操作数为 1,因此该常量会设置你选定的位。or 页面介绍了该运算。
ori 的形式如下所示。它将 rs1 中的值与常量 imm 进行或运算,并将结果写入 rd。
ori rd, rs1, imm
OR 会设置某些位,其余位保持不变,因此当你明确知道要开启哪些标志位时,ori 可以打开特定的标志位。下一行将 t0 中从右数第三位打开,其余所有位保持不变。0b 前缀表示二进制常量。
ori t0, t0, 0b100
配置寄存器、权限标志和状态字都包含相互独立的开、关位,ori 可以在一条指令中打开选定的位,无需掩码寄存器。
RISC-V 手册指出,12 位立即数在运算前会符号扩展为 32 位。因此负常量的所有高位都会被置位,而 ori 与 -1 运算会将结果的所有位都置位。
与 andi 和 addi 一样,常量被限制为 12 位。若要设置该范围之外的位,请使用 li 将更宽的掩码加载到寄存器中,然后使用 or。
示例
li t0, 0 ori t1, t0, 0xf # t1 = 0xf
