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



在 x64 上,从 64 位绝对地址加载(即取消引用 64 位即时地址)可以通过以下方式完成

movabs addr64, %rax

但是,当目标寄存器不是rax时,汇编程序会给出一条错误消息,指出operand size mismatch for movabs。我错过了什么?

从 MOV 指令文档中您可以看到您可以将 64 位立即移动到任何寄存器,但涉及 64 位即时绝对地址的加载/存储只能与 Areg 一起使用

操作码 指令 描述
答0 MOV AL,moffs8* 将字节移动到 (seg:offset) 到 AL。
雷克斯。W + A0 MOV AL,moffs8* 将字节在(偏移量)处移动到 AL。
答1 MOV AX,moffs16* 将单词移动到 (seg:offset) 到 AX。
答1 MOV EAX,moffs32* 将双字 (seg:offset) 移动到 EAX。
雷克斯。W + A1 MOV RAX,moffs64* 将四字(偏移量)移动到 RAX。
答2 MOV moffs8,AL 将 AL 移动到 (seg:offset)。
雷克斯。W + A2 MOV moffs8***,AL 将 AL 移动到(偏移)。
答3 MOV moffs16*,AX 将 AX 移动到 (seg:offset)。
答3 MOV moffs32*,EAX 将 EAX 移动到 (seg:offset)。
雷克斯。W + A3 MOV moffs64*,RAX 将 RAX 移动到(偏移)。

对于除%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(后者)。

相关内容

最新更新