アドレッシングモード別のModR/MとSIBの値

アドレッシングモードと、ModR/M・SIBの相関性がいまいち分からないので、アドレッシングモードのバリエーションを変えてみて実験してみる。

   0:	b8 78 56 34 12       	mov    eax,0x12345678
   5:	89 04 24             	mov    DWORD PTR [esp],eax
   8:	89 f0                	mov    eax,esi
   a:	a1 ff ff ff 7f       	mov    eax,ds:0x7fffffff
   f:	2e a1 ff ff ff 7f    	mov    eax,cs:0x7fffffff
  15:	8b 46 08             	mov    eax,DWORD PTR [esi+0x8]
  18:	8b 44 9e 08          	mov    eax,DWORD PTR [esi+ebx*4+0x8]
  1c:	a3 ff ff ff 7f       	mov    ds:0x7fffffff,eax
  21:	2e a3 ff ff ff 7f    	mov    cs:0x7fffffff,eax
  27:	89 1d ff ff ff 7f    	mov    DWORD PTR ds:0x7fffffff,ebx
  2d:	2e 89 1d ff ff ff 7f 	mov    DWORD PTR cs:0x7fffffff,ebx
  34:	89 46 08             	mov    DWORD PTR [esi+0x8],eax
  37:	89 44 9e 08          	mov    DWORD PTR [esi+ebx*4+0x8],eax

ニーモニック一覧は以下の通り。

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,0x12345678 - B8 - - - 12345678
mov DWORD PTR [esp],eax - 89 04 (00 000 100) 24 (00 100 100) - -
mov eax,esi - 89 F0 (11 110 000) - - -
mov eax,ds:0x7fffffff - A1 - - 7FFFFFFF -
mov eax,cs:0x7fffffff 2E A1 - - 7FFFFFFF -
mov eax,DWORD PTR [esi+0x8] - 8B 46 (01 000 110) - 08 -
mov eax,DWORD PTR [esi+ebx*4+0x8] - 8B 44(01 000 100) 9E (10 011 110) 08 -
mov ds:0x7fffffff,eax - A3 - - 7FFFFFFF -
mov cs:0x7fffffff,eax 2E A3 - - 7FFFFFFF -
mov DWORD PTR ds:0x7fffffff,ebx - 89 1D - 7FFFFFFF -
mov DWORD PTR cs:0x7fffffff,ebx 2E 89 1D - 7FFFFFFF -
mov DWORD PTR [esi+0x8],eax - 89 46 - 08 -
mov DWORD PTR [esi+ebx*4+0x8],eax - 89 44 9E 08 -

即値→レジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,0x12345678 - B8 - - - 12345678

 

field value
prefix -
opecode B8+rd (imm32をEAXレジスタに転送)
ModR/M -
SIB -
displacement -
immediate 12345678

レジスタ→メモリ転送

 

mnemonic prefix opecode ModR/M SIB displacement immediate
mov DWORD PTR [esp],eax - 89 04 (00 000 100) 24 (00 100 100) - -

 

field value
prefix -
opecode 89 (r32をm32に転送)
ModR/M 04
 Mod 00 (レジスタのみで実行アドレスを指定)
 reg/opcode 000 (EAX)
 r/m 100 (SIBあり)
SIB 24
 Scale 00 (x1)
 reg/opcode 100 (インデックスなし)
 r/m 100 (ESP)
displacement -
immediate -

レジスタレジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,esi - 89 F0 (11 110 000) - - -

 

field value
prefix -
opecode 89 (r32をr32に転送)
ModR/M F0
 Mod 11 (レジスタ値を指定)
 reg/opcode 110 (ESI)
 r/m 000 (EAX)
SIB -
displacement -
immediate -

セグメント(DS):オフセット→レジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,ds:0x7fffffff - A1 - - 7FFFFFFF -

 

field value
prefix -
opecode A1 ((セグメント:オフセット)のDWORDをEAXに転送)
ModR/M -
SIB -
displacement 7FFFFFFF
immediate -

セグメント(DS以外):オフセット→レジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,cs:0x7fffffff 2E A1 - - 7FFFFFFF -

 

field value
prefix 2E (CSセグメント・オーバーライド)
opecode A1 ((セグメント:オフセット)のDWORDをEAXに転送)
ModR/M -
SIB -
displacement 7FFFFFFF
immediate -

ベース+8ビットディスプレースメント→レジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,DWORD PTR [esi+0x8] - 8B 46 (01 000 110) - 08 -

 

field value
prefix -
opecode 8B (m32をr32に転送)
ModR/M 46 (01 000 110)
 Mod 01 (レジスタ+8ビットディスプレースメントで実行アドレスを指定)
 reg/opcode 000 (EAX)
 r/m 110 (ESI)
SIB -
displacement 08
immediate -

ベース+インデックス+8ビットディスプレースメント→レジスタ転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov eax,DWORD PTR [esi+ebx*4+0x8] - 8B 44(01 000 100) 9E (10 011 110) 08 -

 

field value
prefix -
opecode 8B (m32をr32に転送)
ModR/M 44 (01 000 100)
 Mod 01 (レジスタ+8ビットディスプレースメントで実行アドレスを指定)
 reg/opcode 000 (EAX)
 r/m 100 (SIBあり+8ビットディスプレースメント)
SIB 9E
 Scale 10 (x4)
 Index 011 (EBX)
 Base 110 (ESI)
displacement 0x8
immediate -

レジスタ→セグメント(DS):オフセット転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov ds:0x7fffffff,eax - A3 - - 7FFFFFFF -

 

field value
prefix -
opecode A3 (EAXを(セグメント:オフセット)に転送)
ModR/M -
SIB -
displacement 7FFFFFFF
immediate -

レジスタ→セグメント(DS以外):オフセット転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov cs:0x7fffffff,eax 2E A3 - - 7FFFFFFF -

 

field value
prefix 2E (CSセグメント・オーバーライド)
opecode A3 (EAXを(セグメント:オフセット)に転送)
ModR/M -
SIB -
displacement 7FFFFFFF
immediate -

レジスタ→セグメント(DS):オフセット転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov DWORD PTR ds:0x7fffffff,ebx - 89 1D - 7FFFFFFF -

 

field value
prefix -
opecode 89 (r32をm32に転送)
ModR/M 1D (00 011 101)
 Mod 00 (レジスタのみで実行アドレスを指定)
 reg/opcode 011 (EBX)
 r/m 101 (32ビットディスプレースメント)
SIB -
displacement 7FFFFFFF
immediate -

レジスタ→セグメント(DS以外):オフセット転送

mnemonic prefix opecode ModR/M SIB displacement immediate
mov DWORD PTR cs:0x7fffffff,ebx 2E 89 1D - 7FFFFFFF -

 

field value
prefix 2E (CSセグメント・オーバーライド)
opecode 89 (r32をm32に転送)
ModR/M 1D (00 011 101)
 Mod 00 (レジスタのみで実行アドレスを指定)
 reg/opcode 011 (EBX)
 r/m 101 (32ビットディスプレースメント)
SIB -
displacement 7FFFFFFF
immediate -

レジスタ→ベース+8ビットディスプレースメント

mnemonic prefix opecode ModR/M SIB displacement immediate
mov DWORD PTR [esi+0x8],eax - 89 46 - 08 -

 

field value
prefix -
opecode 89 (r32をm32に転送)
ModR/M 46 (01 000 110)
 Mod 01 (レジスタ+8ビットディスプレースメントで実行アドレスを指定)
 reg/opcode 000 (EAX)
 r/m 110 (ESI)
SIB -
displacement 08
immediate -

レジスタ→ベース+インデックス+8ビットディスプレースメント

mnemonic prefix opecode ModR/M SIB displacement immediate
mov DWORD PTR [esi+ebx*4+0x8],eax - 89 44 9E 08 -

 

field value
prefix -
opecode 89 (r32をm32に転送)
ModR/M 44 (01 000 100)
 Mod 01 (レジスタ+8ビットディスプレースメント)
 reg/opcode 000 (EAX)
 r/m 100 (SIBあり+8ビットディスプレースメント)
SIB 9E
 Scale 10 (x4)
 Index 011 (EBX)
 Base 110 (ESI)
displacement 08
immediate -