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à?
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à?
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
À 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 rembourrageLa 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.
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.