XOR命令(r xor imm)

レジスタに対する即値とのXOR命令です。

   0:	34 7f                	xor    $0x7f,%al
   2:	66 35 ff 7f          	xor    $0x7fff,%ax
   6:	35 ff ff ff 7f       	xor    $0x7fffffff,%eax
   b:	80 f3 7f             	xor    $0x7f,%bl
   e:	80 f1 7f             	xor    $0x7f,%cl
  11:	80 f2 7f             	xor    $0x7f,%dl
  14:	66 81 f3 ff 7f       	xor    $0x7fff,%bx
  19:	66 81 f1 ff 7f       	xor    $0x7fff,%cx
  1e:	66 81 f2 ff 7f       	xor    $0x7fff,%dx
  23:	81 f3 ff ff ff 7f    	xor    $0x7fffffff,%ebx
  29:	81 f1 ff ff ff 7f    	xor    $0x7fffffff,%ecx
  2f:	81 f2 ff ff ff 7f    	xor    $0x7fffffff,%edx

XOR命令でも、al/ax/eaxレジスタには個別のオペコードが割り当てられています。

で、他のレジスタについては、どーもModR/Mフィールドを使用しているようなので、それぞれのModR/Mフィールドを分解してみると、

命令 オペコード ModR/M(Mod Reg/OpeCode R/M)
XOR %bl imm8 80 F3(11 110 011)
XOR %cl imm8 80 F1(11 110 001)
XOR %dl imm8 80 F2(11 110 010)
XOR %bx imm16 66 81 F3(11 110 011)
XOR %cx imm16 66 81 F1(11 110 001)
XOR %dx imm16 66 81 F2(11 110 010)
XOR %ebx imm32 81 F3(11 110 011)
XOR %ecx imm32 81 F1(11 110 001)
XOR %edx imm32 81 F2(11 110 010)

となっており、Modビットが「11(レジスタ指定)」固定になっており、Reg/OpeCodeが「110」固定になっています(マニュアルには/6の指定あり)。また、R/Mビットに、それぞれのレジスタ番号が指定されています。

// ModR/Mフィールド
 7   6   5   4   3   2   1   0 
+-----------------------------+
| Mod  | Reg/      |   R/M    |
|      | OpeCode   |          |
+-----------------------------+

XOR命令のフォーマットをまとめると、AL/AX/EAXレジスタについては、

命令 オペコード 説明
XOR AL imm8 34 imm8 ALレジスタとimm8とのXORをとる。
XOR AX imm16 66 35 imm16 AXレジスタとimm16とのXORをとる。
XOR EAX imm32 35 imm32 AXレジスタとimm32とのXORをとる。

その他のレジスタについては、

命令 オペコード 説明
XOR r/m8 imm8 80 F0+rb r/m8とimm8とのXORをとる。
XOR r/m16 imm16 66 81 F0+rw r/m16とimm16とのXORをとる。
XOR r/m32 imm32 81 F0+rd r/m32とimm32とのXORをとる。