プロジェクトのために何かを分解していると、次の行に遭遇しました
jmp *0x80498c0(,%eax,4)
そのジャンプ命令は正確に何をしようとしているのですか?これはgdb環境にあります。
ありがとう
プロジェクトのために何かを分解していると、次の行に遭遇しました
jmp *0x80498c0(,%eax,4)
そのジャンプ命令は正確に何をしようとしているのですか?これはgdb環境にあります。
ありがとう
これは間接ジャンプです。
命令は場所を計算し、[0x80498c0 + eax*4]
そこに格納されている値をロードして、この場所に格納されているアドレスにジャンプします。
この種のコードは、ジャンプテーブルでよく見られます。多くの場合、Cswitch
命令または同等のものの後にあります。
編集:*
はAT&T構文に固有です。これは、Cのように、逆参照のニーモニックです。中括弧内の部分が欠落している場合に必要です。jmp 0x80498c0
このアドレスにジャンプするだけでjmp *0x80498c0
、0x80498c0に格納されているポインターのターゲットにジャンプします。
参照メモリ: セクションを参照してください
。32ビットアドレス指定は次のように表示されます(AT&T形式)
immed32(basepointer、indexpointer、indexscale)
これは、によって指定されたアドレスの値として変換されます
immed32+ベースポインター+インデックスポインター*インデックススケール
たとえば、「a」が整数の配列であるa [i]をアドレス指定するには、次のように記述できます。
(%eax、%ebx、4)
eaxレジスタがaのベースポインタを保持し、ebxがインデックスiを持つように。