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位指针?
我可能是错的,因为我很长一段时间没有做过 NASM,但我不认为你可以将 64 位立即值与除AL, AX, EAX, RAX
. 您的 64 位地址必须声明为QWORD
.
解决方案:
mov rax , 0xDEADCODEDEADBEEF
movups xmm0, [rax]
Run Code Online (Sandbox Code Playgroud)
请参阅下面的评论以获取解释。
本文参考:NASM手册
归档时间: |
|
查看次数: |
1525 次 |
最近记录: |