0

Intel64 & IA-32 マニュアル vol 2a から、命令には多くの可能な使用方法がありますmov。そのような:

mov r64, m64      # move m64 to r64

mov rax, moffs64  # move quadword at (offset) to RAX

テストするコードを書きました(ガス、インテル構文):

movabs rax, label

movabs rax, offset label

...
label:
    .quad 0x112233445566

アセンブリ、リンク、および objdump の後、関連するアセンブリを取得しました。

mov rax, qword ptr ds:0xffff80000000008e
mov rax, 0xffff80000000008e

明らかに、私が書いた 2 番目の指示は、マニュアルとして期待される指示ではありません。マニュアルのフォーマットの指示は何ですか?

4

1 に答える 1

2

moffsメモリオペランドを示します。Intelのマニュアルからの説明は次のとおりです。

moffs8, moffs16, moffs32, moffs64— 命令の一部のバリアントで使用されるバイト、ワード、またはダブルワード型の単純なメモリ変数 (メモリ オフセット) MOV。実際のアドレスは、セグメント ベースに対する単純なオフセットによって与えられます。ModR/M命令ではバイトは使用されません。で示される数字moffs は、そのサイズを示します。これは、命令のアドレス サイズ属性によって決定されます。

offsetMASM や TASM などのアセンブラで使用される演算子は、「[オペランド] の関連するセグメントへのオフセット」 (source)を提供します。したがって、得られるのは、即値であるoffset labelのオフセットです。labelつまり、特定のアドレスに格納されている値を取得することと、アドレス自体を取得することです。

バリアントを取得するためのGAS構文がどうなるかはわかりませんmoffs64が、NASMを使用すると記述できますmov rax,[qword label](このエンコーディングは、単純に記述した場合よりも長くなることに注意してくださいmov rax,[label]-つまりmov r64, r/m64)。

于 2014-07-22T13:15:36.313 に答える