从64位地址加载到rax以外的其他寄存器

时间:2013-10-16 22:38:01

标签: assembly x86-64

在x64上,从64位绝对地址加载(即,取消引用64位立即数)可以通过

完成
movabs addr64, %rax

但是,当目标寄存器不是rax时,汇编器会显示错误消息operand size mismatch for movabs。我错过了什么?

2 个答案:

答案 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条指令中完成

  

MOVABSMOV操作码表单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(后者)。