次の行はどういう意味ですか:
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
メモリアドレスの前のアスタリスクは何を意味していますか?また、メモリアクセスメソッドが最初のレジスタ値がない場合はどういう意味ですか?
通常は( "%register"、%rax、8)のようなものですが、この場合は最初のレジスタがありません。
任意のヒント?
実際には、これは計算テーブルjmpです。0x402680はテーブルのアドレスで、raxは8バイト(qword)ポインタのインデックスです。
これはAT&Tアセンブリ構文です。
q
など)。%
_が付き、即値には_$
_が付きますDISP(BASE, INDEX, SCALE)
(DISP + BASE + INDEX * SCALE)です。*
_で示される絶対ジャンプ/呼び出しオペランド(IP相対ではありません)したがって、_%rax * 8 + 0x402680
_に格納されている、クワッドワード長の絶対アドレスにジャンプするためのjmpq
があります。
インテルの構文に物事を取り入れると、常に内容が明確になります。
FF24C5 80264000 JMP QWORD PTR [RAX*8+402680]
jmpq
は、指定されたアドレスへの無条件ジャンプにすぎません。 「q」は、クワッドワード(64ビット長)を扱っていることを意味します。
*0x402680(,%rax,8)
:これは、x-86アセンブリでアドレスを書き込む方法です。通常、最初のコンマの前にはレジスターがあると言って間違いはありませんが、レジスターが指定されていない場合でも同じ規則に従います。
形式は次のように機能します。D(reg1, reg2, scalingFactor)
ここで、Dは変位を表します。変位は基本的に単なる整数です。 reg1
は、最初のレジスタまたはベースレジスタです。 reg2
は2番目のレジスタで、scalingFactor
は2、4、8のいずれかです(1の場合もあるかもしれませんが、それについてはよくわかりません)。これで、次のように値を追加するだけで住所を取得できます:変位+(reg1
での値)+ scalingFactor
*(reg2
での値)。
住所の前にあるアスタリスクが何のためにあるのかは完全にはわかりませんが、それは、変位値がその住所に格納されていることを意味していると思います。
お役に立てれば。
メモリに含まれるアドレスへのジャンプです。アドレスはメモリのアドレスrax*8+0x402680
に格納されます。ここで、rax
は現在のrax
値です(この命令が実行されたとき)。
最小限の例
物事をより明確にするために:
.data
# Store he address of the label in the data section.
symbol: .int label
.text
# Jumps to label.
jmp *symbol
label:
*
がないと、.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)]
_