NOT命令(not r)

レジスタに対するNOT命令です。

   0:	f6 d0                	not    %al
   2:	f6 d3                	not    %bl
   4:	f6 d1                	not    %cl
   6:	f6 d2                	not    %dl
   8:	66 f7 d0             	not    %ax
   b:	66 f7 d3             	not    %bx
   e:	66 f7 d1             	not    %cx
  11:	66 f7 d2             	not    %dx
  14:	f7 d0                	not    %eax
  16:	f7 d3                	not    %ebx
  18:	f7 d1                	not    %ecx
  1a:	f7 d2                	not    %edx

これは、al/ax/eaxレジスタを含むすべてのレジスタに、同じオペコードを割り当てるタイプの命令ですね(al/ax/eaxを特別扱いしない)。

どーもModR/Mフィールドを使用しているようなので、それぞれのModR/Mフィールドを分解してみると、

命令 オペコード ModR/M (Mod Reg/OpeCode R/M)
NOT %al F6 D0 (11 010 000)
NOT %bl F6 D3 (11 010 011)
NOT %cl F6 D1 (11 010 001)
NOT %dl F6 D2 (11 010 010)
NOT %ax 66 F7 D0 (11 010 000)
NOT %bx 66 F7 D3 (11 010 011)
NOT %cx 66 F7 D1 (11 010 001)
NOT %dx 66 F7 D2 (11 010 010)
NOT %abx F7 D0 (11 010 000)
NOT %ebx F7 D3 (11 010 011)
NOT %ecx F7 D1 (11 010 001)
NOT %edx F7 D2 (11 010 010)

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

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

NOT命令のフォーマットをまとめると、

命令 オペコード 説明
NOT r/m8 F6 D0+rb r/m8の各ビットを反転する。
NOT r/m16 66 F7 D0+rw r/m16の各ビットを反転する。
NOT r/m32 F7 D0+rd r/m32の各ビットを反転する。