1. ホーム
  2. assembly

[解決済み] テスト

2022-01-22 14:37:01

質問

アセンブリ関数を読み込むためにgdbデバッガを使用しています。

アセンブリでは、次のような命令になっています。 mov 0xc(%rsp),%eax jmpq *0x402390(,%rax,8)

メモリロケーションにて *0x402390 という値があります。 0x8e . レジスタ rax には、この特定の関数の 2 番目の整数入力があります(変数 y を使用することもできます)。

分析から、この関数は3つの変数を取り込むことがわかりました。 (x, y, z) であり、それらはメモリロケーション (rsp) , (rsp + 8) , (rsp + 12) をそれぞれ作成します。

を知りたいのです。 jmpq *0x402390(,%rax,8) . での命令にジャンプしているのでしょうか? (0x8e + rax*8) ? もしそうなら、その命令の名前をどうやって調べればいいのでしょうか?

これは、関数phase_3のアセンブラコードのフルダンプです。

解決方法は?

からの GAS-マニュアル :

インテル® シンタックスの間接メモリ参照。

 section:[base + index*scale + disp]

はAT&Tの構文に変換されます。

 section:disp(base, index, scale)

ここで、base と index はオプションの 32 ビットベースレジスタとインデックスレジスタです。 disp はオプションのディスプレースメント、scale は値 1、2、2 をとります。 4、8 は、インデックスを乗算してオペランドのアドレスを計算する。

( https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory )

というわけで、以下のように翻訳することができます。 jmpq *0x402390(,%rax,8) を INTEL 構文で表現すると、jmp [RAX*8 + 0x402390] となります。これは間接ジャンプです。RAX*8 + 0x402390] のアドレスが jmp . 次に、0x402390 + x にいくつのアドレスがあるか、どのような場合にそれらを使用するかを決定します。