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