xor
lyszt.net 更详细地介绍了 xor 和其他 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
描述
xor 是一条按位指令。与 and 和 or 一样,它对寄存器的 32 个位置进行操作(and 页面介绍了按位运算)。该名称代表异或(exclusive OR)。在每个位置上,当两个输入位不同(一个为 0、一个为 1)时结果为 1,相同时为 0。下面的形式将其应用于 rs1 和 rs2,并将结果写入 rd。
xor rd, rs1, rs2
有两个特性使 XOR 很有用。一个值与自身进行 XOR 会得到 0,因为每一位都与自身相同,所以下面这行会把寄存器置零。
xor t0, t0, t0
与掩码进行 XOR 会翻转掩码中为 1 的那些位,其余位保持不变。翻转两次即可恢复原值。简单的加密和错误校验都依赖这一点。
XOR 还可以测试相等性。执行下面这行后,如果两个输入相同,t2 为零;如果不同,则非零,分支可以测试该结果。
xor t2, t0, t1
RISC-V 手册将 xor 列为寄存器-寄存器运算之一,它读取 rs1 和 rs2,并将结果写入 rd。它执行按位逻辑异或。
该示例将 t0 清零,无论它之前保存什么。带常量零的 li 指令(load immediate)也能做到同样的事。
示例
xor t0, t0, t0 # t0 = 0
