在x64上,从64位绝对地址加载(即,取消引用64位立即数)可以通过
完成movabs addr64, %rax
但是,当目标寄存器不是rax
时,汇编器会显示错误消息operand size mismatch for movabs
。我错过了什么?
答案 0 :(得分:7)
从MOV instruction document您可以看到您可以将64位立即移动到任何寄存器,但加载/存储涉及64位立即绝对 地址 只适用于Areg
A0 MOV AL,moffs8* Move byte at (seg:offset) to AL.
REX.W + A0 MOV AL,moffs8* Move byte at (offset) to AL.
A1 MOV AX,moffs16* Move word at (seg:offset) to AX.
A1 MOV EAX,moffs32* Move doubleword at (seg:offset) to EAX.
REX.W + A1 MOV RAX,moffs64* Move quadword at (offset) to RAX.
A2 MOV moffs8,AL Move AL to (seg:offset).
REX.W + A2 MOV moffs8***,AL Move AL to (offset).
A3 MOV moffs16*,AX Move AX to (seg:offset).
A3 MOV moffs32*,EAX Move EAX to (seg:offset).
REX.W + A3 MOV moffs64*,RAX Move RAX to (offset).
正如您所看到的,没有ModR / M字节来编码寄存器编号。由于这比将64位立即数移动到寄存器更常用,因此不会有问题。如果确实需要,可以在2条指令中完成
MOVABS
是MOV
操作码表单MOV Areg, [Offs64]
和MOV [Offs64], Areg
的GAS操作码名称。在Yasm的NASM语法模式中,您可以通过MOV AX, [qword xxx]
来获取此表单。 Yasm的GAS语法模式接受MOVABS
(兼容GAS)。请注意,此表单仅在Areg(AL / AX / EAX / RAX)作为源/目标寄存器时有效。*
http://cvs.tortall.net/pipermail/yasm-devel/2006-March/000579.html
答案 1 :(得分:3)
对于%rax
以外的任何注册,可以用两条指令替换它:
48 bb f0 de bc 9a 78 56 34 12 mov $0x123456789abcdef0,%rbx
48 8b 1b mov (%rbx),%rbx
这比单一的更长,
48 a1 f0 de bc 9a 78 56 34 12 mov 0x123456789abcdef0,%rax
因此,如果可以使用它,你很可能更喜欢movabs
(后者)。