2013-10-16 72 views
8

在x64,從64位的絕對地址加載(即,解引用64位立即)可通過載入到其它寄存器比RAX

movabs addr64, %rax 

完成然而,當目標寄存器不是rax時,彙編器會給出錯誤消息operand size mismatch for movabs。我錯過了什麼?

+0

Nit:上面的彙編程序指令既不是Intel也不是AT&T語法;在英特爾語法中,它是'MOV RAX,[addr64]',而在AT&T它是'movabs addr64,%rax'。 –

+0

關於RE:http://reverseengineering.stackexchange.com/questions/2627/what-is-the-meaning-of-movabs-in-gas-x86-att-syntax –

回答

7

沒辦法。它只能從AREG

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

+0

我不會在Ubuntu 14.04上重現這一點英特爾酷睿i5-3210M binutils 2.25與[此代碼](https://github.com/cirosantilli/assembly-cheat/blob/73dd35d9e4978ab0c461464df58ba0699fce9979/x86-64/gas/movabs.s)。英特爾手冊說'MOV r64,imm64'應該可以工作。也許事情發生了變化? –

+1

'movabs $ 0x1000000000000000 ,%rax'類似於'mov rax,0x1000000000000000',但是'movabs 0x1000000000000000,%rax'類似於'mov rax,[qword 0x1000000000000000]' –

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