2010-11-08 11 views
5

cuando compilo este pedazo de códigoGCC hotpatching?

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

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

salidas gcc

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

en una máquina x86_64.

La pregunta es: ¿por qué hay una instrucción nop (mov edi, edi) allí?

Estoy usando gcc-4.4.4.

+0

Naturalmente, ¡solo se trata de ofuscar el código! –

Respuesta

3

En el modo de 64 bits, mov edi, edi no es una operación nula. Lo que hace es establecer los 32 bits superiores de rdi en 0.

Este es un caso especial del hecho general de que todas las operaciones de 32 bits borran los 32 bits superiores del registro de destino en el modo de 64 bits. (Esto permite una CPU más eficiente que dejarlos sin cambios y quizás también sea más útil).

+0

oh ... ¿puedes citar alguna fuente para eso? – osgx

+0

parece ser la respuesta. – osgx

+1

Bien. Creo que tienes razón sobre esto. es solo una forma elegante de despejar la parte superior de rdi. Después de releer la pregunta, entiendo que el OP no pregunta "¿Por qué esta función de acceso directo comienza con' mov edi, edi' "pero algo así como" ¿Por qué este código de ensamblado x86-64 parece una función de acceso directo? " Además, el código ni siquiera especifica el attriubte 'ms_hook_prologue', la última versión de gcc no admite ms_hook_prologue para x86-64 y parece que en x86-64 usará un' leaq [% rsp + 0],% rsp' prologue en lugar de 'mov edi, edi' (http://tinyurl.com/39fye3w). Eliminaré mi respuesta –