在NASM中声明恒定的64位地址

Ine*_*ion 5 64-bit assembly x86-64 nasm 32bit-64bit

我需要在自修改程序的代码中声明一个伪绝对地址.此指针的作用类似于链接器的重定位 - 它仅在指令中保留适当的空间,并在运行时稍后使用有效地址进行更新.这在x86-32上对我来说很好用:

movups xmm0, [0xDEADBEEF]
Run Code Online (Sandbox Code Playgroud)

这会在运行时按预期进行组装和工作.但是,当我尝试在x86-64代码中执行此操作时:

movups xmm0, [0xDEADC0DEDEADBEEF]
Run Code Online (Sandbox Code Playgroud)

它汇编了以下警告:

warning: dword data exceeds bounds
Run Code Online (Sandbox Code Playgroud)

并在运行时迅速崩溃,因为下一条指令被地址的其余部分覆盖,这恰好是垃圾指令.

任何超过32位的地址都无法在没有警告的情况下进行汇编,即使是比32位更短的地址:

movups xmm0, [0xADEADBEEF] ; 36-bit address
Run Code Online (Sandbox Code Playgroud)

我应该如何声明一个恒定的,绝对的64位指针?或者是没有办法解决它,我需要在那里删除一个RIP相对的32位指针?

Tre*_*ski 3

我可能是错的,因为我很长一段时间没有做过 NASM,但我不认为你可以将 64 位立即值与除AL, AX, EAX, RAX. 您的 64 位地址必须声明为QWORD.

解决方案:

mov rax , 0xDEADCODEDEADBEEF
movups xmm0, [rax]
Run Code Online (Sandbox Code Playgroud)

请参阅下面的评论以获取解释。

本文参考:NASM手册

  • @IneQuation 这可能是毫无意义的尝试。`mov rax , 0xDEADCODEDEADBEEF` 然后 `movups xmm0, [rax]` 我确信您已经尝试过。抱歉我帮不了什么忙:( (2认同)
  • 这个答案是正确的,但描述性不太好。您只能使用 64 位绝对地址来*移动*到累加器或从累加器中*移动*,而不能使用它进行任何操作。但是,您可以将 64 位立即值移动到任何 64 位 GPR 中,这正是您想要做的。`mov rax, 0xDEADCODEDEADBEEF \n movups xmm0, [rax]` (编辑:刚刚注意到 Trevor 在我寻找参考以确保没有其他操作可以使用它时发布了该代码。) (2认同)