【发布时间】:2014-09-07 11:40:37
【问题描述】:
在为 Microsoft 的 x64 汇编程序编写的一个简单程序中,我想在 SSE 寄存器(例如 xmm0)和通用寄存器(例如 rcx)之间移动一个 64 位值,如
mov xmm0, rcx
...
mov rcx, xmm0
这两行分别从ml64.exe 生成以下错误消息:
- 错误 A2152:协处理器寄存器不能作为第一个操作数
- 错误 A2070:指令操作数无效
但是,显然可以在 x64 中完成这个简单的任务。例如,以下是一个功能正常的 x64 程序,我可以在 GAS
.text
.globl main
main:
movl $1, %ecx
movq %rcx, %xmm0
movq %xmm0, %rax
ret
正如所料,该程序的返回值为 1,main() 的 objdump 输出为:
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
所以我的问题是,鉴于ml64.exe 产生了上述错误,我该如何在 MASM 中完成此操作?
【问题讨论】:
-
有趣的是,在这种情况下,
movq不是 at&t 的发明,而是实际的指令。请参阅指令集参考。 PS:你也可以将 objdump 切换为 intel 语法。 -
@Jester,我忘了提到
ml64.exe拒绝movq(如果我使用代替mov)并显示错误消息“错误 A2150:字寄存器不能是第一个操作数”和“错误 A2070:无效的指令操作数”。在我用 GAS 组装的简单程序上使用 MSFT 的dumpbin.exe,我发现 MSFT 列出了与movd相同的指令,所以我尝试了它并且它有效。如果没有其他人这样做,我会将其作为答案发布。 -
奇怪,
movd应该是 32 位版本。 -
@Jester:完全正确。可能是 MASM 中的一个错误。
标签: assembly x86-64 masm sse gnu-assembler