6

64ビットモードで絶対アドレスから読み取りたいとしましょうgs:$30.asmコードは次のようになります:

asm
  mov   rax, gs:[$30]
end;

...そしてコンパイラはこのコードを...に変換します

  65 48 8B 05 30 00 00 00       mov rax,gs:[rel $00000030]

しかし、私は相対アドレスを使いたくありません(rip + $30)。コンパイラで絶対アドレスを使用して、次のようにコンパイルする必要があります。

  65 48 8B 04 25 30 00 00 00    mov rax,gs:[+$0030]

gs:(接頭辞を付けても付けなくても同じです!)

どうすればいいですか?

編集:

私は回避策を知っています。場所を相対ではなく絶対としてアドレス指定するようにコンパイラに指示するコマンドが存在するかどうかを尋ねます。

編集

ここまでは順調ですね... :)

drhirsch がコマンドを見つけるのを手伝ってくれたので、コンパイラは次のように翻訳します。

mov   rax, gs:[abs qword ptr $30]
or
mov   rax, gs:[abs $30]

これに:

6548A13000000000000000 mov rax,[qword $0000000000000030]

これはほとんど問題ありません:)長い64ビットオペコードよりも短い32ビットオペコード(上のオペコードを見てください)が欲しいからです。

長い代わりに短い 32 ビット アドレス オペコードを使用するようにコンパイラに指示する方法はありますか?

4

1 に答える 1

4

movabs命令を使用する必要があります。

movabs  rax, gs:[$30]

編集: rip 相対アドレス指定がデフォルト モードです。一部のアセンブラでは、32 ビット絶対アドレス指定を強制できる場合があります。

mov rax, gs:[dword $30]  #nasm, tasm
mov rax, gs:[abs $30]    #yasm
于 2011-12-15T14:20:37.903 に答える