43 votes

Quel est l'intérêt de LEA EAX, [EAX]?

 LEA EAX, [EAX]
 

J'ai rencontré cette instruction dans un binaire compilé avec le compilateur Microsoft C. Cela ne peut clairement pas changer la valeur de EAX. Alors pourquoi est-ce là?

81voto

codaddict Points 154968

C'est un NOP .

Les éléments suivants sont généralement utilisés en tant que NOP . Ils font tous la même chose, mais ils donnent un code machine de longueur différente. En fonction des exigences d'alignement, l'un d'entre eux est choisi:

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

34voto

Frederick The Fool Points 9092

À partir de cet article:

Cette astuce est utilisée par MSVC++ compilateur à émettre de la NOP instructions de de longueur différente (pour le rembourrage avant des cibles de saut). Par exemple, MSVC++ génère le code suivant s'il les besoins de 4 octets 6 octets de padding:

8d6424 00 lea [ebx+00],ebx ; 4 octets de padding 8d9b 00000000
lea [esp+00000000],esp ; 6 octets rembourrage

La première ligne est marquée comme "npad 4" dans l'assemblée des listes générées par le compilateur, et la seconde est la npad 6". Les registres (ebx, esp) peut être choisi du rarement utilisé celles à éviter fausses dépendances dans le code.

Donc, c'est juste une sorte de NOP, apparaissant juste avant les objectifs de jmp instructions afin de les aligner.

Fait intéressant, vous pouvez identifier le compilateur à partir de la caractéristique de la nature de ces instructions.

3voto

Eli Bendersky Points 82298
 LEA EAX, [EAX]
 

En effet, cela ne change pas la valeur de EAX. Autant que je sache, sa fonction est identique à:

 MOV EAX, EAX
 

L'avez-vous vu dans un code optimisé ou non optimisé?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X