x86-64 AT&Tアセンブリでアドレスの前のアスタリスク*は何を意味しますか? 質問する

x86-64 AT&Tアセンブリでアドレスの前のアスタリスク*は何を意味しますか? 質問する

次の行はどういう意味ですか?

...
401147: ff 24 c5 80 26 40 00    jmpq   *0x402680(,%rax,8)
...

メモリ アドレスの前のアスタリスクはどういう意味ですか? また、メモリ アクセス メソッドに最初のレジスタ値がない場合はどういう意味ですか?

通常は ("%register", %rax, 8) のようなものです。ただし、この場合は最初のレジスタがありません。

任意のヒント?

ベストアンサー1

これは AT&T アセンブリ構文です:

  • 送信元が送信先より先に来る
  • ニーモニックサフィックスはオペランドのサイズを示します(qquad など)
  • レジスタには接頭辞が付き%、即値には$
  • DISP(BASE, INDEX, SCALE)有効アドレスは(DISP + BASE + INDEX * SCALE)の形式です。
  • 間接ジャンプ/呼び出しオペランドは*(直接ではなく) で示されます。

したがって、 に格納され、4 ワード長でjmpqある絶対アドレスにジャンプするための があります。%rax * 8 + 0x402680


jmp fooAT&T 構文では、RIP = foo ( ) と RIP = load from some symbol address ( )を区別する方法が必要でしたjmp *foo。 はmovl $1, foo絶対アドレスへのストアであることを覚えておいてくださいfoo

他のアドレス指定モードでは、どのような種類のジャンプ/呼び出しを実行しているかが曖昧になることはなく、ベア ラベル以外のものはすべて間接的である必要があります。(GAS はそれを推測し、またはまたはベア シンボル名以外のものを*実行すると、間接ジャンプについて警告します。)jmp %raxjmp 24(%rax)

(64 ビット モードでは、通常、jmp *foo(%rip)グローバル変数を RIP にロードするために を使用し、 のような 32 ビット絶対アドレスは使用しませんjmp *foo。ただし、その可能性は存在し、AT&T 構文が設計された x86-64 より前では、これが通常の方法でした。)

おすすめ記事