2010-11-08 17 views
5

Quando compilo questo pezzo di codiceGCC hotpatching?

unsigned char A[] = {1, 2, 3, 4}; 

unsigned int 
f (unsigned int x) 
{ 
    return A[x]; 
} 

uscite gcc

mov edi, edi 
movzx eax, BYTE PTR A[rdi] 
ret 

su una macchina x86_64.

La domanda è: perché esiste un'istruzione nop (mov edi, edi)?

Sto usando gcc-4.4.4.

+0

Ovviamente è solo per offuscare il codice! –

risposta

3

In modalità 64 bit, mov edi, edi non è un no-op. Quello che fa è impostare i primi 32 bit di rdi su 0.

Questo è un caso particolare del fatto generale che tutte le operazioni a 32 bit cancellano i primi 32 bit del registro di destinazione in modalità 64 bit. (Ciò consente una CPU più efficiente che lasciarle invariate e forse è anche più utile.)

+0

oh .. puoi citare qualche fonte per questo? – osgx

+0

sembra essere la risposta. – osgx

+1

Ok. Penso che tu abbia ragione su questo. è solo un modo elegante per cancellare la cima di rdi. Dopo aver riletto la domanda, capisco che l'OP non sta chiedendo "Perché questa funzione hotpatchable inizia con' mov edi, edi' ", ma qualcosa del tipo" Perché questo codice assembly x86-64 sembra una funzione hotpatchable. " Anche il codice non specifica nemmeno l'attriubo 'ms_hook_prologue', l'ultima versione di gcc non supporta ms_hook_prologue per x86-64 e sembra che su x86-64 userà un' leaq [% rsp + 0],% rsp' prologo invece di 'mov edi, edi' (http://tinyurl.com/39fye3w). Cancellerò la mia risposta –