2010-09-02 193 views
2

我需要movlps与立即地址是64位宽的指令,根据英特尔手册应该是完全可能的。所以,这样的事情:NASM的movlps的64位立即地址给出“dword数据超出界限”

movlps xmm0, [0x7fffffffffa0] 

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

sample.s:6: warning: dword data exceeds bounds 

我有不同形式的四字前缀的尝试没有成功。

+0

http://stackoverflow.com/questions/19415184/load-from-a-64-bit-address-into-other-register-than-rax – 2015-05-26 06:42:30

+0

顺便说一句,你应该使用'movsd'来加载8个字节并零延伸到一个xmm寄存器。只有在您特别想要与旧版xmm0合并时才使用'movlps',或者在没有SSE2的情况下锁定SSE1。 (在这种情况下,您可能想首先用'xorps xmm0,xmm0'打破旧值的错误依赖关系。 – 2018-02-24 16:29:55

+0

这不是被截断的操作数大小,而是被截断的地址以适合' disp32]'寻址模式。 (或者如果你使用了'DEFAULT REL',通常是一个好主意''[RIP + disp32]')。 – 2018-02-24 16:44:07

回答

4

大多数的x64指令不采取64位IMMED。除非我非常误会你必须通过rax寄存器。

+0

是的,x86-64仅支持64位绝对寻址模式,用于加载/存储AL/AX/EAX/RAX,[像'mov rax,[0x7fffffffffafa]]](http://stackoverflow.com/questions/ 19415184 /负载从-A-64位地址 - 到 - 其他寄存器超RAX)。或者,使用mov rdi,0x7fffffffffa0将64位立即数放入任何寄存器,并使用其他任何指令使用正常的[rdi]寻址模式。 – 2018-02-24 16:41:13

4

我不认为你可以这样做。加载或存储这是64位宽,但即时地址和位移一般仍限制在32位。你能做的最好的是

mov rax, 0x7fffffffffa0 
movlps xmm0, [rax] 

(第一mov可能需要movabs,我真的不知道英特尔的语法组装)

+0

'mov'助记符可以在NASM/YASM语法中使用'mov r64,imm64'编码,如果编号是这样的:mov r32,imm32或mov r/m64,sign_extended_imm32都不能这样做。只有GAS需要'movabs'助记符。 – 2018-02-24 16:37:17