在为Microsoft的x64汇编程序编写的简单程序中,我想在SSE寄存器(比如xmm0)和通用寄存器(比如rcx)之间移动64位值,如< MASM中的Intel语法> :
mov xmm0, rcx
...
mov rcx, xmm0
这两行分别从ml64.exe
:
但是,显然可以在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中实现这一目标?
答案 0 :(得分:4)
MOV
指令不能在通用寄存器和xmm
寄存器之间移动数据。您正在寻找的指令是MOVQ
(就像您显示的A& T语法代码中一样),如英特尔instruction set manuals中所定义。
ML64不接受MOVQ
的事实与英特尔的手册不一致,因此 - 至少在我看来 - 是一个错误(或至少是不一致)。 ML64似乎确实使用MOVD
,即使对于64位寄存器也是如此。您可以通过反汇编它生成的代码来验证这一点。