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 ビット アドレス オペコードを使用するようにコンパイラに指示する方法はありますか?