xor

xor

RISC-V アセンブリ 参考

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(排他的論理和)を表します。各位置において、結果は 2 つの入力ビットが異なる場合(一方が 0 でもう一方が 1)は 1 となり、一致する場合は 0 となります。以下の形式はこれを rs1 と rs2 に適用し、結果を rd に書き込みます。

xor rd, rs1, rs2

XOR を有用にする 2 つの性質があります。値はそれ自身と XOR すると 0 になります。すべてのビットが自分自身と一致するためです。したがって、次の行はレジスタをゼロに設定します。

xor t0, t0, t0

マスクとの XOR は、マスクが 1 であるビットを反転し、それ以外は変更しません。2 回反転すると元の値に戻ります。単純な暗号化やエラーチェックはこれに依存しています。

XOR は等価性のテストにも使えます。以下の行の後、t2 は 2 つの入力が同一であればゼロになり、異なれば非ゼロになり、分岐でその結果をテストできます。

xor t2, t0, t1

RISC-V マニュアルでは、xor はレジスタ間演算の一つとして記載されており、rs1 と rs2 を読み取り、結果を rd に書き込みます。これはビット単位の論理排他的論理和を実行します。

この例では、t0 が以前に何を保持していても 0 にクリアします。定数ゼロを伴う li 命令(load immediate)も同じことを行います。

例

xor t0, t0, t0   # t0 = 0