Какой смысл ЛЕИ EAX, [EAX]?

LEA EAX, [EAX]

Я встретился с этой инструкцией в двоичном файле, скомпилированном с компилятором Microsoft C. Это ясно не может изменить значение EAX. Затем, почему это там?

43
задан Frederick The Fool 15 March 2017 в 05:15
поделиться

3 ответа

Это NOP .

Следующие типы обычно используются как NOP . Все они делают одно и то же, но приводят к машинному коду разной длины. В зависимости от требований к выравниванию выбирается один из них:

xchg eax, eax         = 90
mov eax, eax          = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 
81
ответ дан 26 November 2019 в 22:33
поделиться

Из этой статьи:

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, чтобы выровнять их.

Интересно, что вы можете идентифицировать компилятор по характерному характеру таких инструкций.

34
ответ дан 26 November 2019 в 22:33
поделиться
LEA EAX, [EAX]

Действительно не меняет значение EAX. Насколько я понимаю, по функциям он идентичен:

MOV EAX, EAX

Вы видели это в оптимизированном или неоптимизированном коде?

3
ответ дан 26 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: