在x64,從64位的絕對地址加載(即,解引用64位立即)可通過載入到其它寄存器比RAX
movabs addr64, %rax
完成然而,當目標寄存器不是rax
時,彙編器會給出錯誤消息operand size mismatch for movabs
。我錯過了什麼?
在x64,從64位的絕對地址加載(即,解引用64位立即)可通過載入到其它寄存器比RAX
movabs addr64, %rax
完成然而,當目標寄存器不是rax
時,彙編器會給出錯誤消息operand size mismatch for movabs
。我錯過了什麼?
沒辦法。它只能從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
我不會在Ubuntu 14.04上重現這一點英特爾酷睿i5-3210M binutils 2.25與[此代碼](https://github.com/cirosantilli/assembly-cheat/blob/73dd35d9e4978ab0c461464df58ba0699fce9979/x86-64/gas/movabs.s)。英特爾手冊說'MOV r64,imm64'應該可以工作。也許事情發生了變化? –
'movabs $ 0x1000000000000000 ,%rax'類似於'mov rax,0x1000000000000000',但是'movabs 0x1000000000000000,%rax'類似於'mov rax,[qword 0x1000000000000000]' –
對於除%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
(後者)。
Nit:上面的彙編程序指令既不是Intel也不是AT&T語法;在英特爾語法中,它是'MOV RAX,[addr64]',而在AT&T它是'movabs addr64,%rax'。 –
關於RE:http://reverseengineering.stackexchange.com/questions/2627/what-is-the-meaning-of-movabs-in-gas-x86-att-syntax –