and
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
