OR

RISC-V OR 指令详解

指令手册R-type

将rs1与rs2按位或,结果写入rd

指令语法

or rd, rs1, rs2
操作数说明
rd:接收结果;rd 与源重叠时先读取旧源值,rd=x0 丢弃写回。
rs1、rs2:两个 XLEN 位源寄存器,逐位或;没有立即数字段。
适用于 RV32I/RV64I;x0 源值恒为 0。
RV32IRV64I逻辑运算

指令行为说明

OR 使用 R 型编码:读取 rs1 和 rs2 的 XLEN 位值,逐 bit 执行或运算并将结果写入 rd。其固定字段为 opcode=0110011、funct3=110 和 funct7=0000000。

OR 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs1
rs2
or
,
,
执行环境

本例使用固定寄存器初值和初始 PC=0x2000;取指成功,没有异步中断或额外扩展检查。异常分支只显示普通提交停止,陷入后的 PC 和处理程序状态由 EEI 决定。

t1(x6)
0x00000014
t2(x7)
0x00000007
31..25
24..20
19..15
14..12
11..7
6..0
0000000
funct7
00111
rs2
00110
rs1
110
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x007362B3
opcode
0110011 -> OP
funct3
110 -> OR bitwise OR
funct7
0000000 -> base ALU op
rd / rs1 / rs2
t0(x5) / t1(x6) / t2(x7)
bitwise ALU
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x007362B3
syntax : or t0(x5), t1(x6), t2(x7)
待提交结果: 尚未计算
当前架构状态
t0(x5) = 0x00003001; pc = 0x00002000
逐 bit 逻辑视图
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
rs1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
rs2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

OR 是 RV32I/RV64I 基础整数 R-type 逻辑指令:从 rs1 与 rs2 读取两个 XLEN 宽寄存器值,逐 bit 执行 OR,结果写入 rd。它适合把掩码中为 1 的目标 bit 置 1,或合并两个 bit 字段。

opcode=0110011 选择 OP 类,funct3=110 且 funct7=0000000 选择 OR。
OR 不使用立即数字段;小立即数置位通常使用 ORI,寄存器中的掩码或字段合并使用 OR。

常见使用场景

置位掩码

RV32I/RV64I,x6=20、x7=7:or x5, x6, x7 得到 x5=23(0x17);掩码为 1 的位被置位。

位字段合并

RV32I/RV64I,x6=20、x7=7:or x5, x6, x7 得到 x5=23(0x17);掩码为 1 的位被置位。

使用前检查清单

语法检查
  • rd、rs1、rs2 选择 x0–x31 或 ABI 别名;没有立即数或 rs3。
语义检查
  • OR 是 RV32I/RV64I 基础整数 R-type 逻辑指令:从 rs1 与 rs2 读取两个 XLEN 宽寄存器值,逐 bit 执行 OR,结果写入 rd。它适合把掩码中为 1 的目标 bit 置 1,或合并两个 bit 字段。
  • 源与目的重叠时先读取旧源值;x0 恒为零,写入 x0 被丢弃。

容易混淆 / 常见误区

OR 是逐位逻辑运算,不是算术加法;它没有立即数字段

常见问题

OR 和 ORI 有什么区别?

OR 读取 rs1 与 rs2 两个寄存器;ORI 读取 rs1 并使用符号扩展的 12 位立即数。

OR 有立即数操作数吗?

没有。OR 的 R 型编码使用 rs1 和 rs2;带 12 位符号扩展立即数的按位或是 ORI。