and

and

RISC-V 汇编 参考

lyszt.net 更详细地介绍了 and 和其他 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

描述

and 是按位指令。一个寄存器保存 32 位,也就是一行中 32 个独立的 0 和 1。按位指令将其运算独立地应用于全部 32 个位置,并且位置之间不会传递进位。

在单个位上,AND 仅当两个输入位都为 1 时才给出 1,否则给出 0。下面的形式将该规则应用于全部 32 个位置,比较 rs1 和 rs2,并将结果写入 rd。

and rd, rs1, rs2

AND 用于掩码,即保留某些位并清除其他位。在掩码为 1 的位置,原始位保持不变。在掩码为 0 的位置,结果为 0。将某个值与掩码 00001111 进行 AND,会保留低四位并清除其余位。掩码用于从打包了多个字段的值中提取一个字段。

RISC-V 手册将 and、or 和 xor 列为寄存器-寄存器运算。它们都读取源寄存器 rs1 和 rs2,将结果写入目标寄存器 rd,并执行按位逻辑运算。

在示例中,0b1100(0b 前缀表示二进制数字)与 0b1010 进行 AND。两个输入都只在最左侧位置有 1,因此结果为 0b1000,并存入 t2。

示例

li t0, 0b1100
li t1, 0b1010
and t2, t0, t1   # t2 = 0b1000