Error: operand size mismatch for `movq'

Error: operand size mismatch for `movq'

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

movq [=10=]x3534373536383235, 0x000000000055638f8
movq [=10=]x55638f8, %rdi
retq

第一个行抛出错误Error: operand size mismatch for 'movq'

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

我做了一些调查,movabsq 被推荐了,就像这样...

movabsq [=11=]x3534373536383235, 0x000000000055638f8
movq [=11=]x55638f8, %rdi
retq

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

我错过了什么?

这是我的 mac

的全部错误
level3.s:1:27: error: invalid operand for instruction
movq [=12=]x3534373536383235, 0x000000000055638f8
                          ^~~~~~~~~~~~~~~~~~~

如果您在引理 MOV 下查看手册(诚然,这有点令人生畏),您会发现没有 mov r/m64, imm64.

有一种方法可以将一个完整的 64 位常量加载到一个寄存器中,也有一种方法可以将一个符号扩展的 32 位常量加载到一个 64 位内存位置,但是没有一条指令可以将 64 位立即数写入它记忆中。

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

一种方法是:

movabsq  [=10=]x3534373536383235, %rax
movabsq  %rax, 0x000000000055638f8

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