DEC命令(r)
レジスタに対するDEC命令です。
0: fe c8 dec %al 2: fe cb dec %bl 4: fe c9 dec %cl 6: fe ca dec %dl 8: 66 48 dec %ax a: 66 4b dec %bx c: 66 49 dec %cx e: 66 4a dec %dx 10: 48 dec %eax 11: 4b dec %ebx 12: 49 dec %ecx 13: 4a dec %edx
おお、DEC命令は、INC命令とはオペコードのみが異なる…と予想していたのですが、違ったようですね。オペコード長が2バイトの場合、どーも、オペコード部はINC命令と同じなんですけど、ModR/MフィールドのReg/OpeCodeビットが違っているようです。実際、Intelのマニュアルを見ると、「FE /1」「FF /1」となっています(「/1」はReg/OpeCodeビットにセットする値)。
例えば、「dec %bl」のニーモニックは「FE CB」ですが、この2バイト目(ModR/Mフィールド)を2進数で表現すると、「11 001 011」となりますが、これは
Mod = 11(レジスタ指定) Reg/OpeCode = 001(/1) R/M = 011(blレジスタ)
を意味します。16進数で表現すると、「CB(=1100 1011)」となります。
7 6 5 4 3 2 1 0 +-----------------------------+ | Mod | Reg/ | R/M | | | OpeCode | | +-----------------------------+
DEC命令のフォーマットとしては、オペランドにr/mを指定する場合、INC命令と同じオペコードを使用するが、Reg/OpeCodeの値で区別する。ということですね。
オペコード | 説明 |
---|---|
FE C8+rb | r/mバイトを1デクリメントする。 |
66 48+rw | ワードレジスタを1デクリメントする。 |
48+rd | ダブルワード・レジスタを1デクリメントする。 |
ちなみに、INC命令同様、DEC命令も、CF(キャリーフラグ)に影響を与えません。