次の行はどういう意味ですか?
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
メモリアドレスの前のアスタリスクはどういう意味ですか?また、メモリアクセスメソッドに最初のレジスタ値がない場合、それはどういう意味ですか?
通常は( "%register"、%rax、8)のようなものですが、この場合、最初のレジスタはありません。
任意のヒント?
次の行はどういう意味ですか?
...
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8)
...
メモリアドレスの前のアスタリスクはどういう意味ですか?また、メモリアクセスメソッドに最初のレジスタ値がない場合、それはどういう意味ですか?
通常は( "%register"、%rax、8)のようなものですが、この場合、最初のレジスタはありません。
任意のヒント?
実際には、これは計算されたテーブル jmpであり、0x402680 は tableele のアドレスであり、rax は 8 バイト (qword) ポインターのインデックスです。
メモリに含まれるアドレスへのジャンプです。アドレスはメモリの address に格納されますrax*8+0x402680
。ここrax
で、 は現在のrax
値です (この命令が実行されたとき)。
jmpq
指定されたアドレスへの無条件ジャンプです。「q」は、クワッド ワード (64 ビット長) を扱っていることを意味します。
*0x402680(,%rax,8)
: これは、x-86 アセンブリでアドレスを記述する方法です。通常、最初のコンマの前にレジスターがあると言っているのは正しいですが、レジスターが指定されていない場合でも同じ規則に従います。
形式は次のよう
に機能します。D(reg1, reg2, scalingFactor)
ここで、D は変位を表します。変位は基本的に単なる整数です。reg1
最初のレジスタまたはベース レジスタです。reg2
は 2 番目のレジスタであり、scalingFactor
2、4、8 のいずれかです (1 である可能性もありますが、それについてはわかりません)。これで、次のように値を追加するだけでアドレスを取得できます: 変位 + (値 at reg1
) + scalingFactor
*(値 at reg2
)。
アドレスの前のアスタリスクが何のためにあるのか完全にはわかりませんが、私の推測では、変位値がそのアドレスに格納されていることを意味します。
お役に立てれば。
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)]