movlps的NASM 64位立即地址给出“ dword数据超出范围”

dsi*_*ign 2 assembly sse x86-64 nasm

我需要带有64位立即数地址的movlps指令,根据Intel手册,这应该是完全可能的。因此,如下所示:

movlps xmm0, [0x7fffffffffa0]
Run Code Online (Sandbox Code Playgroud)

但是我得到的是NASM将操作数大小截断为32位并打印相应的警告:

sample.s:6: warning: dword data exceeds bounds
Run Code Online (Sandbox Code Playgroud)

我尝试了不同形式的qword前缀,但没有成功。

zwo*_*wol 5

我认为您无法做到。 movlps加载或存储一个64位宽的,但立即地址和位移通常仍限于32位。你能做的最好的就是

mov rax, 0x7fffffffffa0
movlps xmm0, [rax]
Run Code Online (Sandbox Code Playgroud)

(第一个mov可能需要movabs;我不太了解Intel语法汇编)


Jos*_*hua 5

大多数x64指令都不会采用64位的格式。

除非我非常误解,否则您必须遍历rax寄存器。

  • 是的,x86-64 支持 64 位绝对寻址模式,仅用于 AL/AX/EAX/RAX 的加载/存储,[如`mov rax, [0x7fffffffffa0]`](http://stackoverflow.com/questions/19415184 /load-from-a-64-bit-address-into-other-register-than-rax)。或者,使用 `mov rdi, 0x7fffffffffa0` 将 64 位立即数放入任何寄存器,并使用普通的 `[rdi]` 寻址模式与任何其他指令。 (2认同)