¿Cuál es el punto de LEA EAX, ?

LEA EAX, [EAX] 

Encontré esta instrucción en un binario comstackdo con el comstackdor de Microsoft C. Claramente no puede cambiar el valor de EAX. Entonces, ¿por qué está allí?

Es un NOP .

Los siguientes son típicamente usados ​​como NOP . Todos hacen lo mismo pero resultan en un código de máquina de diferente longitud. Dependiendo del requerimiento de alineación se elige uno de ellos:

 xchg eax, eax = 90 mov eax, eax = 89 C0 lea eax, [eax + 0x00] = 8D 40 00 

De este artículo:

Este truco es utilizado por el comstackdor MSVC ++ para emitir las instrucciones NOP de diferente longitud (para el relleno antes de los objectives de salto). Por ejemplo, MSVC ++ genera el siguiente código si necesita un relleno de 4 bytes y 6 bytes:

8d6424 00 lea [ebx + 00], ebx; Relleno de 4 bytes 8d9b 00000000
lea [esp + 00000000], esp; Relleno de 6 bytes

La primera línea está marcada como “npad 4” en los listados de ensamblaje generados por el comstackdor, y la segunda es “npad 6”. Los registros (ebx, esp) se pueden elegir entre los que se usan raramente para evitar falsas dependencias en el código.

Así que esto es solo un tipo de NOP, que aparece justo antes de los objectives de las instrucciones jmp para alinearlos.

Curiosamente, puede identificar el comstackdor a partir de la naturaleza característica de tales instrucciones.

 LEA EAX, [EAX] 

De hecho no cambia el valor de EAX. Por lo que yo entiendo, es idéntico en función a:

 MOV EAX, EAX 

¿Lo viste en código optimizado, o código no optimizado?