c assembly x86 instruction-set

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



assembly x86 (3)

LEA EAX, [EAX]

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


De this artículo:

Este truco es utilizado por el compilador MSVC ++ para emitir las instrucciones NOP de diferente longitud (para el relleno antes de los objetivos 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; Acolchado de 6 bytes

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

Así que esto es solo una especie de NOP, que aparece justo antes de los objetivos de las instrucciones de jmp para alinearlos.

Curiosamente, puede identificar el compilador de la naturaleza característica de tales instrucciones.


Es un NOP .

Los siguientes son típicamente usados ​​como NOP . Todos hacen lo mismo pero dan como resultado códigos de máquina de diferente longitud. Según el requisito de alineación, se elige uno de ellos:

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


LEA EAX, [EAX]

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

MOV EAX, EAX

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