在 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
(后者)。