5

相対ジャンプに関して次の質問があります。

  1. 私はそれが現在のPCに比べてバイトJMP SHORT <displacement>にジャンプすることを理解しています。<displacement>あれは正しいですか?
  2. アセンブラが相対ジャンプのオペコードを自動的に生成するというのは本当ですか?つまり、書き込みを行ったときにJMP <label>、そのラベルが現在のPCから128バイト以内にある場合、相対ジャンプが生成されますか?
  3. を使用したい場合JMP SHORT <displacement>、変位を計算する正しい方法は何ですか?リストファイルを調べてオフセットを計算することによって?
4

2 に答える 2

5

各アセンブラー (プログラム) およびアセンブラーの各バージョンは、デフォルトで long または short を選択できます。したがって、すべてのアセンブラがデフォルトで 1 つのものを使用するという包括的なステートメントを探すつもりはありません。興味がある場合は、試してみて、何が起こるかを確認してください。

x86 と可変長の命令では、単純に変位をコード化するのは非常に難しく、ジャンプとターゲットの間のコードに決して触れないように注意する必要があります。

はい、アセンブラーにラベルを使用して命令をコーディングさせることから始めます。次に、命令セットのリファレンス マニュアルとアドレスを含む逆アセンブリを取得し、変位がどのように計算されるかを理解します。アセンブラで変位を自分で設定できる場合、それはおそらくアセンブラ固有のものであり、その変位が必要な単位を知る必要があります。x86はおそらくバイトですが、固定ワード長の命令セットでは、バイトではなく命令単位で変位を与える必要がある場合があります。またはバイトではなく命令なので、変位を使用してから再度逆アセンブルして、正しい命令が計算されたことを確認します。

于 2012-06-22T18:34:29.260 に答える
2

アセンブラーが自動的に短いエンコードまたは通常のエンコードを使用したとします。一見すると、可能であれば常に短いエンコーディングに切り替えても問題ないように見えるかもしれませんが、実際にはそうすることが可能であり、他のブランチを再び長いエンコーディングに変更する必要があります。

例(テストされていないか、アイデアを得るために):

  jmp _skip          ; relative offset depends on
               the size of "other code", which may include other jumps
  ; other code
_skip:

したがって、サイズを決定するために「フォワード」パスを実行することはできません。そのジャンプにいるときは、他のジャンプをどうするかまだ決めていないため、それが収まるかどうかはまだわかりません。 .

じゃあ後ろ向き?(ただアイデアを得るために、テストされていないか、何もありません)

  .fill 124
  jmp _somewhere     ; 2 bytes, or 5?
  jmp _quiteFarAway  ; relative offset is either 130 or 127
  .align 256
_quiteFarAway:

いいえ、後方パスも実行できません。_quiteFarAway へのジャンプのエンコーディングを決定するとき、他のジャンプをどうするかまだ決めていないため、それが適合するかどうかはまだわかりません。

ポイント 2 を実行するのは難しく、それを解決するにはさまざまな方法があります。そのような明示的な「短い」修飾子、明示的な「長い」修飾子を使用して、安全な推測を行い、まれに必要のない長いバージョンになるなど.

于 2012-06-22T20:24:46.253 に答える