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を意味する。