web-dev-qa-db-ja.com

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

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

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

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

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

任意のヒント?

31
de1337ed

実際には、これは計算テーブルjmpです。0x402680はテーブルのアドレスで、raxは8バイト(qword)ポインタのインデックスです。

18
GJ.

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

  • ソースが宛先の前に来る
  • ニーモニックサフィックスは、オペランドのサイズを示します(クワッドの場合はqなど)。
  • レジスタの前には_%_が付き、即値には_$_が付きます
  • 有効なアドレスの形式はDISP(BASE, INDEX, SCALE)(DISP + BASE + INDEX * SCALE)です。
  • _*_で示される絶対ジャンプ/呼び出しオペランド(IP相対ではありません)

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

16

インテルの構文に物事を取り入れると、常に内容が明確になります。

FF24C5 80264000  JMP QWORD PTR [RAX*8+402680]
12
Necrolis

jmpqは、指定されたアドレスへの無条件ジャンプにすぎません。 「q」は、クワッドワード(64ビット長)を扱っていることを意味します。

*0x402680(,%rax,8):これは、x-86アセンブリでアドレスを書き込む方法です。通常、最初のコンマの前にはレジスターがあると言って間違いはありませんが、レジスターが指定されていない場合でも同じ規則に従います。

形式は次のように機能します。D(reg1, reg2, scalingFactor)ここで、Dは変位を表します。変位は基本的に単なる整数です。 reg1は、最初のレジスタまたはベースレジスタです。 reg2は2番目のレジスタで、scalingFactorは2、4、8のいずれかです(1の場合もあるかもしれませんが、それについてはよくわかりません)。これで、次のように値を追加するだけで住所を取得できます:変位+(reg1での値)+ scalingFactor *(reg2での値)。

住所の前にあるアスタリスクが何のためにあるのかは完全にはわかりませんが、それは、変位値がその住所に格納されていることを意味していると思います。

お役に立てれば。

5
vyb

メモリに含まれるアドレスへのジャンプです。アドレスはメモリのアドレスrax*8+0x402680に格納されます。ここで、raxは現在のrax値です(この命令が実行されたとき)。

5
Alexey Frunze

最小限の例

物事をより明確にするために:

.data
    # Store he address of the label in the data section.
    symbol: .int label   
.text   
    # Jumps to label.
    jmp *symbol
    label:

GitHubアップストリーム

*がないと、.dataセクションとsegfaultのsymbolのアドレスにジャンプします。

ほとんどの命令では、この構文は少し一貫性がないと感じています。

mov symbol, %eax
mov label, %eax

はすでにアドレスsymbolにデータを移動しており、アドレスには$symbolが使用されています。 Intel構文は、間接参照に常に[]を使用するため、この点でより一貫性があります。

*はもちろん、C逆参照演算子*ptrのニーモニックです。

Necrolisが書いたように、Intelの構文では少しわかりやすくなっていますが、 [〜#〜] rtn [〜#〜] の方が明確です。この線

_jmpq   *0x402680(,%rax,8)
_

rTNでは次のように記述されます。

_RIP <- M[0x402680 + (8 * RAX)]
_

ここで、Mはシステムメモリです。

そのため、一般的な形式jmpq *c(r1, r2, k)を記述できます。ここで、cは即値定数、_r1_および_r2_は汎用レジスター、kは1(デフォルト)、2のいずれかです。 4または8:

_RIP <- M[c + r1 + (k * r2)]
_
4
eepp