LEA EAX, [EAX]
Я встретился с этой инструкцией в двоичном файле, скомпилированном с компилятором Microsoft C. Это ясно не может изменить значение EAX. Затем, почему это там?
Это NOP
.
Следующие типы обычно используются как NOP
. Все они делают одно и то же, но приводят к машинному коду разной длины. В зависимости от требований к выравниванию выбирается один из них:
xchg eax, eax = 90
mov eax, eax = 89 C0
lea eax, [eax + 0x00] = 8D 40 00
Из этой статьи:
This Трюк используется компилятором MSVC ++ для выдачи инструкций NOP разной длины (для заполнения перед целевыми объектами перехода). Например, MSVC ++ генерирует следующий код, если требует 4-байтового и 6-байтового заполнения:
8d6424 00 lea [ebx + 00], ebx ; 4-байтовое заполнение 8d9b 00000000
lea [esp + 00000000], esp; 6-байтовое заполнениеПервая строка помечена как «npad 4» в списках сборок, созданных компилятором , а вторая - «npad 6». { {1}} Регистры (ebx, esp) можно выбрать из редко используемых, чтобы избежать ложных зависимостей в коде.
Так что это просто своего рода NOP, появляющийся прямо перед целями инструкций jmp, чтобы выровнять их.
Интересно, что вы можете идентифицировать компилятор по характерному характеру таких инструкций.
LEA EAX, [EAX]
Действительно не меняет значение EAX. Насколько я понимаю, по функциям он идентичен:
MOV EAX, EAX
Вы видели это в оптимизированном или неоптимизированном коде?