SIBのフォーマットと符号化

今回は、SIBとディスプレースメントを持つニーモニックについて見ていきます。

まず、命令フォーマットにおけるSIBとディスプレースメントの位置ですが、それぞれ以下の位置に配置されます。

// 一般的命令フォーマット
+-------+-------------------+----------+----------+----------+
| Prefix| Opcode |  ModR/M  | SIB      | Displace-| Immediate|
|       |        |          |          | ment     |          |
+-------+-------------------+----------+----------+----------+
                             ********** **********

今回、解析する機械語リストは、以下です。

   0:	8b 46 08             	mov    eax,DWORD PTR [esi+0x8]
   3:	8b 44 1e 08          	mov    eax,DWORD PTR [esi+ebx*1+0x8]
   7:	66 8b 44 9e 08       	mov    ax,WORD PTR [esi+ebx*4+0x8]

上のニーモニックについて、ModR/MとSIBをビット列に分解してみました。

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

1行ずつ見ていきます。

mov eax,DWORD PTR [esi+0x8]

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

 

Field Value
prefix 無し。
opecode 「8B」(ダブルワードr/mを扱う、メモリ→レジスタ間転送のmov命令)
ModR/M
 Mod 「01」(実行アドレスの指定に、8ビット値のディスプレースメント(0x8)を使用)
 Reg/Opecode 「000」(eax)
 r/m 「110」(ベースアドレスにesiレジスタを指定)
SIB なし(実行アドレスの指定にインデックスレジスタを使用していない)
displacement 「08」

mov eax,DWORD PTR [esi+ebx*1+0x8]

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

 

Field Value
prefix 無し。
opecode 「8B」(ダブルワードr/mを扱う、メモリ→レジスタ間転送のmov命令)
ModR/M  
 Mod 「01」(実行アドレスの指定に、8ビット値のディスプレースメント(0x8)を使用)
 Reg/Opecode 「000」(eax)
 r/m 「100」(ModR/Mのつぎに8ビット値のディスプレースメントを持つSIBが来る)
SIB  
 Scale 「00」(1)
 Index 「011」(ebx)
 Base 「110」(esi)
displacement 「08」

mov ax,WORD_PTR [esi+ebx*4+0x8]

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

 

Field Value
prefix 「66」(ワードr/mを扱う)
opcode 「8B」(ワードr/mを扱う、メモリ→レジスタ間転送のmov命令)
ModR/M  
 Mod 「01」(実行アドレスの指定に、8ビット値のディスプレースメント(0x8)を使用)
 Reg/Opecode 「000」(eax)
 r/m 「100」(ModR/Mのつぎに8ビット値のディスプレースメントを持つSIBが来る)
SIB  
 Scale 「10」(4)
 Index 「011」(ebx)
 Base 「110」(esi)
displacement 「08」(8)

SIBのフォーマットと符号化

今回初めて、SIBというのが出てきましたが、SIBというのは、実行アドレスの計算に使用する情報がセットされます。また、ディスプレースメントというのは、SIBで算出したアドレスに加算する値で、実行アドレスにディスプレースメント値を加算すると、最終的な実行アドレスが求められます。

SIBのフォーマットは、以下の通り。

// SIBフィールド
 7   6   5   4   3   2   1   0
+-----------------------------+
|Scale | Index     | Base     |
|      |           |          |
+-----------------------------+

実行アドレスの計算は、以下の式で求めます。

Effective Address = (Scale * Index + Base) + displacement

Scale・Index・Baseのコード体系は、以下の通り。

Scale スケール値
00 x1
01 x2
10 x4
11 x8

 

Index レジスタ
000 EAX
001 ECX
010 EDX
011 EBX
100 なし
101 EBP
110 ESI
111 EDI

 

Base レジスタ
000 EAX
001 ECX
010 EDX
011 EBX
100 ESP
101 ※1
110 ESI
111 EDI

※1 … Modが00の場合はベースなしの32ビットディスプレートメント。それ以外の場合は、8ビットまたは32ビットディスプレースメント+EBPを意味する。