AND命令(r and imm)

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

   0:	24 7f                	and    $0x7f,%al
   2:	66 25 ff 7f          	and    $0x7fff,%ax
   6:	25 ff ff ff 7f       	and    $0x7fffffff,%eax
   b:	80 e3 7f             	and    $0x7f,%bl
   e:	80 e1 7f             	and    $0x7f,%cl
  11:	80 e2 7f             	and    $0x7f,%dl
  14:	66 81 e3 ff 7f       	and    $0x7fff,%bx
  19:	66 81 e1 ff 7f       	and    $0x7fff,%cx
  1e:	66 81 e2 ff 7f       	and    $0x7fff,%dx
  23:	81 e3 ff ff ff 7f    	and    $0x7fffffff,%ebx
  29:	81 e1 ff ff ff 7f    	and    $0x7fffffff,%ecx
  2f:	81 e2 ff ff ff 7f    	and    $0x7fffffff,%edx

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

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

命令 オペコード ModR/M(Mod Reg/OpeCode R/M)
AND %bl imm8 80 E3(11 100 011)
AND %cl imm8 80 E1(11 100 001)
AND %dl imm8 80 E2(11 100 010)
AND %bx imm16 66 81 E3(11 100 011)
AND %cx imm16 66 81 E1(11 100 001)
AND %dx imm16 66 81 E2(11 100 010)
AND %ebx imm32 81 E3(11 100 011)
AND %ecx imm32 81 E1(11 100 001)
AND %edx imm32 81 E2(11 100 010)

となっており、Modビットが「11(レジスタ指定)」固定になっています。また、R/Mビットに、それえぞれのレジスタ番号が指定されています。

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

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

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

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

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