6

プロジェクトのために何かを分解していると、次の行に遭遇しました

jmp *0x80498c0(,%eax,4)

そのジャンプ命令は正確に何をしようとしているのですか?これはgdb環境にあります。

ありがとう

4

2 に答える 2

10

これは間接ジャンプです。

命令は場所を計算し、[0x80498c0 + eax*4]そこに格納されている値をロードして、この場所に格納されているアドレスにジャンプします。

この種のコードは、ジャンプテーブルでよく見られます。多くの場合、Cswitch命令または同等のものの後にあります。

編集:*はAT&T構文に固有です。これは、Cのように、逆参照のニーモニックです。中括弧内の部分が欠落している場合に必要です。jmp 0x80498c0このアドレスにジャンプするだけでjmp *0x80498c0、0x80498c0に格納されているポインターのターゲットにジャンプします。

于 2012-04-18T08:44:47.463 に答える
3

参照メモリ: セクションを参照してください
。32ビットアドレス指定は次のように表示されます(AT&T形式)

immed32(basepointer、indexpointer、indexscale)

これは、によって指定されたアドレスの値として変換されます

immed32+ベースポインター+インデックスポインター*インデックススケール

たとえば、「a」が整数の配列であるa [i]をアドレス指定するには、次のように記述できます。

(%eax、%ebx、4)

eaxレジスタがaのベースポインタを保持し、ebxがインデックスiを持つように。

于 2012-04-18T02:16:18.327 に答える