错误:`movq'的操作数大小不匹配

时间:2016-10-13 22:36:05

标签: assembly x86-64

我正在尝试编译以下程序集......

movq $0x3534373536383235, 0x000000000055638f8
movq $0x55638f8, %rdi
retq

第一个行会引发错误Error: operand size mismatch for 'movq'

这对我来说没有意义,因为它们都是8个字节的数字。

我做了一点研究,推荐movabsq,就像这样......

movabsq $0x3534373536383235, 0x000000000055638f8
movq $0x55638f8, %rdi
retq

但这会引发错误:Error: operand size mismatch for 'movabs'

我错过了什么?

这是我的mac的整个错误

level3.s:1:27: error: invalid operand for instruction
movq $0x3534373536383235, 0x000000000055638f8
                          ^~~~~~~~~~~~~~~~~~~

2 个答案:

答案 0 :(得分:6)

如果您查看引理MOV下的手册(不可否认,这有点令人生畏),您会发现没有mov r/m64, imm64

有一种方法可以将一个完整的64位常数加载到寄存器中,并且可以将符号扩展的32位常量加载到64位存储器位置,但没有一条指令需要64位立即将其写入内存。

所以你必须分两步完成,例如使用临时寄存器或直接将两个dwords写入内存。

答案 1 :(得分:3)

一种方法是:

movabsq  $0x3534373536383235, %rax
movabsq  %rax, 0x000000000055638f8

正如另一条评论所说,你不能将64位立即移动到64位存储器地址,因为没有允许你这样做的指令。此操作码丢失,因为操作码当前不能超过15个字节,并且仅两个64位值是16个字节,并且必须是操作码的一部分。此限制适用于较小的操作码,这些操作码也会因前缀而变得过大。因为您要移动到绝对的64位内存地址,所以您需要使用movabs或movabsq,无论您的汇编程序喜欢哪个。