首页/指令库/与取反操作数
ANDN

RISC-V ANDN 指令详解

指令手册R-type

rs2 按位取反后与 rs1 相与

指令语法

andn rd, rs1, rs2

rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。

rs2 是按 XLEN 位取反的第二个源,不是取反 rs1。

要求 RV32/RV64 的 Zbb 或 Zbkb;rd = rs1 & ~rs2。

BZbbZbkb位操作整数运算

指令行为说明

Zbb 或 Zbkb 的 andn 计算 rd = rs1 & ~rs2,按 XLEN 位取反 rs2 后相与。

ANDN 指令解析与执行动画

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

rd
rs1
rs2
andn
,
,
执行环境

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

a0(x10)
0x00001000
t1(x6)
0x00000014
31..25
24..20
19..15
14..12
11..7
6..0
0100000
funct7
00110
rs2
01010
rs1
111
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x406572B3
opcode
0110011 -> OP
funct3
111 -> ANDN
funct7
0100000 -> ANDN selector
rd / rs1 / rs2
t0(x5) / a0(x10) / t1(x6)
bitwise ALU
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

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

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

encoding: 0x406572B3
syntax : andn t0(x5), a0(x10), t1(x6)
待提交结果: 尚未计算
当前架构状态
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
1
0
0
0
0
0
0
0
0
0
0
0
0
rs1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
1
rs2 (inverted)
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
& ~
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

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

快速理解与检索要点

andn 计算 rs1 & ~rs2:先按位取反 rs2,再与 rs1 按位相与。

andn 属于 Zbb;Zbkb 也包含此指令。它按 XLEN 宽整数寄存器位模式运算。
rs2 会先按位取反再与 rs1 相与;不要把它读成 ~rs1 & rs2。

常见使用场景

位操作与掩码

RV32/RV64,Zbb 或 Zbkb;x11=0xff、x12=0x0f:x10=0xf0,清除掩码为 1 的位。

寄存器操作

RV32/RV64,Zbb 或 Zbkb;x11=0xff、x12=0x0f:x10=0xf0,清除掩码为 1 的位。

使用前检查清单

语法检查
  • rd、rs1 选择 x0–x31;源读取写回前的值,写入 x0 被丢弃。
  • rs2 是按 XLEN 位取反的第二个源,不是取反 rs1。
语义检查
  • 要求 RV32/RV64 的 Zbb 或 Zbkb;rd = rs1 & ~rs2。

容易混淆 / 常见误区

rs2 会先按位取反再与 rs1 相与;不要把它读成 ~rs1 & rs2。