INC命令(r)

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

   0:	fe c0                	inc    %al
   2:	fe c3                	inc    %bl
   4:	fe c1                	inc    %cl
   6:	fe c2                	inc    %dl
   8:	66 40                	inc    %ax
   a:	66 43                	inc    %bx
   c:	66 41                	inc    %cx
   e:	66 42                	inc    %dx
  10:	40                   	inc    %eax
  11:	43                   	inc    %ebx
  12:	41                   	inc    %ecx
  13:	42                   	inc    %edx

ワードレジスタに対するオペコードの命令プリフィックスに「66」がついているのは、いつもの通り。
INC命令は、オペコード(1バイト)+ModR/Mフィールド(1バイト)の2バイト、またはオペランドにワードレジスタ、ダブルワードレジスタを指定する場合、オペコード(1バイト)のみで表現することも可能です。以下は、ModR/Mフィールドのフォーマットです。

 7   6   5   4   3   2   1   0 
+-----------------------------+
| Mod  | Reg/      |   R/M    |
|      | OpeCode   |          |
+-----------------------------+

「Mod」には、レジスタ値指定の場合、「11」がセットされます。「Reg/Opecode」は、オペコード拡張用のフィールドで、命令フォーマットの/digitの値がセットされます(INC命令の場合だと、命令フォーマットには「FE /0」とあるため、Reg/Opecodeには「0」に対応する「000」がセットされる(後述の表を参照))。「R/M」フィールドには、レジスタ番号がセットされます。

正確な情報は、Intel IA-32デベロッパーズマニュアル中巻Aの「表 2-2. ModR/Mバイトによる 32 ビット・アドレス指定形式」を参照のこと。アドレス指定形式とModR/Mフィールドの対応表が記載されています。

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

オペコード 説明
FE C[r/m] r/mバイトを1インクリメントする。
66 40+rw ワードレジスタを1インクリメントする。
40+rd ダブルワード・レジスタを1インクリメントする。

Intelの資料を見ると、ワードレジスタおよびダブルワードレジスタに対するINC命令のオペコードは、それぞれ「66 FF C[r/m]」「FF C[r/m]」でも可能だと思われますが、「66 40+rw」「40+rd」というニーモニックが出力されたのは、gccによる最適化(命令長がより短い表現を選択する、とか)でしょうか。

ちなみに、INC命令の結果は、CF(キャリーフラグ)に影響を与えません。