我正在尝试编译以下程序集......
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
^~~~~~~~~~~~~~~~~~~
答案 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,无论您的汇编程序喜欢哪个。