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(キャリーフラグ)に影響を与えません。