2012-05-08 6 views

Respuesta

16

Es un NOP. Agrega los contenidos de% esi y 0x0, y pone el resultado en% esi. Alguien tiene un generador de código torpe o necesita llenar N bytes, donde esta instrucción es del tamaño correcto.

Las instrucciones LEA se ejecutan bastante rápido (normalmente 1 reloj), por lo que es mucho mejor que N nops.

El x86 es tan peculiar como lo es, tiene una variedad de instrucciones que efectivamente no hacen nada más que llenar diferentes números de bytes. Puede encontrar otras instrucciones inútiles de diferentes longitudes. Tiende a encontrar instrucciones que son largas pero se ejecutan en 1 reloj o menos.

El manual de AMD x86-64 tiene algunas sugerencias sobre qué se debe usar para NOP; sugieren que uno de los prefijos del prefijo se repita varias veces antes de un NOP real, IIRC. Dichos prefijos de prefijo se consumen muy rápidamente por el motor de captación de instrucciones; en su mayoría, su costo está oculto en la precarga de la instrucción y no en el tiempo de ejecución de la instrucción.

+1

Este último, a menos que GCC sea un torpe generador de códigos. Gracias por la rápida respuesta. – Brian

+3

Un punto interesante es que 'lea 0x0 (% esi),% esi' es una opción no operativa solo en el código de 32 bits. En el código de 64 bits, esta instrucción además pone a cero la palabra doble más alta de '% rsi'. Hasta ahora, he visto a GCC insertar tales instrucciones solo en el código de 32 bits. – Eugene

+3

.... por lo tanto, el objetivo de "recomendar NOP multibyte" de AMD. –

Cuestiones relacionadas