5

自己変更プログラムのコードでダミーの絶対アドレスを宣言する必要があります。このポインタは、リンカの再配置と同様に機能します。命令内の適切なスペースのみを予約し、実行時に有効なアドレスで更新されます。これは、x86-32では問題なく機能しました。

movups xmm0, [0xDEADBEEF]

これは、実行時に期待どおりに組み立てられ、機能します。ただし、x86-64コードでこれを実行しようとすると、次のようになります。

movups xmm0, [0xDEADC0DEDEADBEEF]

次の警告とともに組み立てられます。

warning: dword data exceeds bounds

また、次の命令が残りのアドレスで上書きされるため、実行時にすぐにクラッシュします。これは、たまたま命令的にガベージになっています。

32ビットより長いアドレスは、警告なしにアセンブルできません。少なくとも32ビットより長いアドレスでも次のようになります。

movups xmm0, [0xADEADBEEF] ; 36-bit address

定数の絶対64ビットポインタを宣言するにはどうすればよいですか?または、それを回避する方法がなく、RIP相対の32ビットポインタをそこにドロップする必要がありますか?

4

1 に答える 1

3

NASMを長い間行っていないので間違っているかもしれませんが、。以外のレジスタで64ビットの即値を使用できるとは思いませんAL, AX, EAX, RAX。64ビットアドレスはとして宣言する必要がありQWORDます。

解決:

mov rax , 0xDEADCODEDEADBEEF
movups xmm0, [rax]

説明については、以下のコメントを参照してください。

このリファレンス:NASMマニュアル

于 2012-11-04T16:18:53.687 に答える