在ml64中移动xmm和通用寄存器之间的四字?

时间:2014-07-16 19:44:31

标签: assembly 64-bit x86-64 masm gas

在为Microsoft的x64汇编程序编写的简单程序中,我想在SSE寄存器(比如xmm0)和通用寄存器(比如rcx)之间移动64位值,如< MASM中的Intel语法> :

mov xmm0, rcx
...
mov rcx, xmm0

这两行分别从ml64.exe

生成以下错误消息
  • 错误A2152:协处理器寄存器不能是第一个操作数
  • 错误A2070:无效的指令操作数

但是,显然可以在x64中完成这个简单的任务。例如,以下是一个正常运行的x64程序,我可以使用GCC 4.8.2>组装和运行GAS< AT& T语法:

.text
    .globl main
main:
    movl $1, %ecx
    movq %rcx, %xmm0
    movq %xmm0, %rax
    ret

正如预期的那样,此程序的返回值为1,objdump的{​​{1}}输出为:

main()

所以我的问题是,如果1004010d0: b9 01 00 00 00 mov $0x1,%ecx 1004010d5: 66 48 0f 6e c1 movq %rcx,%xmm0 1004010da: 66 48 0f 7e c0 movq %xmm0,%rax 1004010df: c3 retq 产生上述错误,我怎样才能在MASM中实现这一目标?

1 个答案:

答案 0 :(得分:4)

MOV指令不能在通用寄存器和xmm寄存器之间移动数据。您正在寻找的指令是MOVQ(就像您显示的A& T语法代码中一样),如英特尔instruction set manuals中所定义。

ML64不接受MOVQ的事实与英特尔的手册不一致,因此 - 至少在我看来 - 是一个错误(或至少是不一致)。 ML64似乎确实使用MOVD,即使对于64位寄存器也是如此。您可以通过反汇编它生成的代码来验证这一点。