andi
lyszt.net 更详细地介绍了 andi 和其他 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
描述
andi 执行与常量的按位 AND 运算。and 接受两个寄存器,但 andi 接受一个寄存器和一个立即数,即编码在指令中的固定值。i 代表立即数(immediate)。AND 规则不变:只有当两个输入位都为 1 时,结果位才为 1,因此该常量充当掩码,保留某些位并清除其他位。掩码和按位运算在 and 页面中介绍。
andi 的形式如下所示。它将 rs1 中的值与常量 imm 进行 AND 运算,并将结果写入 rd。
andi rd, rs1, imm
当你事先知道要保留哪些位时使用它。下面这行保留 t0 的最低 8 位并清除高 24 位,从更大的值中提取一个字节。0x 前缀表示十六进制常量。
andi t1, t0, 0xff
该常量必须能放入 12 位,因此无法表示宽掩码。对于更大的掩码,用 li 将其加载到寄存器中并使用 and。
RISC-V 手册指出,12 位立即数在运算前会符号扩展为 32 位,因此负常量的所有高位都会被置位。andi、ori 和 xori 对寄存器 rs1 和该扩展值执行按位运算,并将结果放入 rd。
以下是两种常见用法。下面第一行只保留最低位,奇数时为 1,偶数时为 0。第二行给出除以 8 后的余数,因为对 2 的幂取无符号余数就是取最低位。
andi t1, t0, 1 andi t1, t0, 7
示例
andi t1, t0, 0xff # keep only the low byte
