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 回答