LEA EAX, [EAX]
Я столкнулся с этой инструкцией в бинарном файле, скомпилированном с помощью компилятора Microsoft C. Он явно не может изменить значение EAX. Тогда почему оно там?
LEA EAX, [EAX]
Я столкнулся с этой инструкцией в бинарном файле, скомпилированном с помощью компилятора Microsoft C. Он явно не может изменить значение EAX. Тогда почему оно там?
It is a NOP
.
Следующие обычно используются как NOP
. Все они делают одно и то же, но машинный код получается разной длины. В зависимости от требований к центровке выбирается один из них:
xchg eax, eax = 90
mov eax, eax = 89 C0
lea eax, [eax + 0x00] = 8D 40 00
NOP
, поскольку вводит зависимость данных от EAX
. Современные ЦП определяют этот конкретный шаблон как NOP
и игнорируют зависимость данных, но некоторые старые ЦП могут этого не делать.
- person Jörg W Mittag; 24.04.2010
nop
— это 0x90
, который совпадает с xchg eax, eax
.
- person Nathan Fellman; 24.04.2010
Из этой статьи:
Этот прием используется компилятором MSVC++ для выдачи инструкций NOP разной длины (для заполнения перед целями перехода). Например, MSVC++ генерирует следующий код, если ему требуется 4-байтовое и 6-байтовое заполнение:
8d6424 00 lea [ebx+00],ebx ; 4-байтовое заполнение 8d9b 00000000
lea [esp+00000000],esp ; 6-байтовое заполнениеПервая строка помечена как «npad 4» в ассемблерных листингах, сгенерированных компилятором, а вторая — «npad 6». Регистры (ebx, esp) можно выбирать из редко используемых, чтобы избежать ложных зависимостей в коде.
Так что это просто своего рода NOP, появляющийся прямо перед целями инструкций jmp для их выравнивания.
Интересно, что вы можете определить компилятор по характерному характеру таких инструкций.
NOP
, — это только половина ответа (но, как ни странно, выбранный). Объяснение, почему вы хотите сделать эти NOP
, является полным ответом. Отличная работа.
- person JUST MY correct OPINION; 24.04.2010
LEA EAX, [EAX]
Действительно, не изменяет значение EAX. Насколько я понимаю, по функциям он идентичен:
MOV EAX, EAX
Вы видели это в оптимизированном коде или в неоптимизированном коде?
/O2
?
- person Alex Budovski; 24.04.2010