2013-10-16 4 views
8

Su x64, carico da un indirizzo a 64 bit assoluta (cioè, dereferenziare a 64 bit immediato) può essere fattoCarica da un indirizzo a 64 bit in un altro registro di rax

movabs addr64, %rax 

Tuttavia, quando il registro di destinazione è diverso da rax, l'assemblatore visualizza un messaggio di errore che indica operand size mismatch for movabs. Cosa mi manca?

+0

Nit: l'istruzione assembler sopra non è né la sintassi Intel né AT & T; nella sintassi Intel, è 'MOV RAX, [addr64]' mentre in AT & T è 'movabs addr64,% rax'. –

+0

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

risposta

7

Niente da fare. Si può caricare solo da Areg

MOVABS è il nome GAS codice operativo per le MOV forme di codice operativo MOV Areg, [Offs64] e MOV [Offs64], Areg.
Nella modalità di sintassi NASM di Yasm, è possibile ottenere questo modulo dicendo MOV AX, [qword xxx]. La modalità di sintassi GAS di Yasm accetta MOVABS (per compatibilità GAS).
Nota questo modulo è valido solo con Areg (AL/AX/EAX/RAX) come registro sorgente/destinazione. *

http://cvs.tortall.net/pipermail/yasm-devel/2006-March/000579.html

+0

Non lo riproduco su Ubuntu 14.04 Binutils Intel Core i5-3210M 2.25 con [questo codice] (https://github.com/cirosantilli/assembly-cheat/blob/73dd35d9e4978ab0c461464df58ba0699fce9979/x86-64/gas/movabs.s). E il manuale Intel dice 'MOV r64, imm64' dovrebbe funzionare. Forse qualcosa è cambiato da allora? –

+1

'movabs $ 0x1000000000000000 ,% rax' è simile a 'mov rax, 0x1000000000000000' ma' movabs 0x1000000000000000,% rax' è simile a 'mov rax, [qword 0x1000000000000000]' –

3

Per qualsiasi registro diverso %rax può sostituirlo da due istruzioni:

48 bb f0 de bc 9a 78 56 34 12 mov $0x123456789abcdef0,%rbx 
48 8b 1b      mov (%rbx),%rbx 

Questo è più lungo di quello singolo,

48 a1 f0 de bc 9a 78 56 34 12 mov 0x123456789abcdef0,%rax 

quindi probabilmente preferiresti lo movabs (quest'ultimo) se puoi usarlo.