4

問題のある行:

 8048f70:   ff 24 85 00 a4 04 08    jmp    *0x804a400(,%eax,4)

逆アセンブルされたコードの 804a400 の位置に命令はありません (私のリストは 804a247 で終わります)

そのメモリの場所にあるものを確認すると、次のようになります。

(gdb) x/c 0x804a40c
0x804a40c:  -103 '\231'

(gdb) x/t 0x804a40c
0x804a40c:  10011001

(gdb) x/s 0x804a40c
0x804a40c:   "\231\217\004\b\222\217\004\b\211\217\004\b\202\217\004\bw\217\004\b\002"

(gdb) x/3x 0x804a40c
0x804a40c:  0x99    0x8f        0x04

この jmp ステートメントは正確に何をしようとしているのでしょうか?

4

1 に答える 1

9

その命令は間接ジャンプです。これは、指定されたメモリ アドレスがジャンプ先ではなく、ジャンプ先へのポインタであることを意味します。

まず、命令はメモリ アドレスに値をロードします。

*0x804a400(,%eax,4)

これはより賢明に次のように書かれています。

0x804a400 + %eax * 4  // %eax can be negative

次に、%eip をその値に設定します。

これらを解読する最善の方法は、Intel Programmer's Reference マニュアルを使用することです。第 2 巻 A の表 2-2 は、ModR/M バイトの内訳を示しており、この場合は SIB バイトも示しています。

于 2012-10-11T20:31:27.753 に答える