Какой смысл LEA EAX, [EAX]?

LEA EAX, [EAX]

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

Ответ 1

Это NOP.

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

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

Ответ 2

Из эта статья:

Этот трюк используется компилятором MSVС++ испускать инструкции NOP разная длина (для заполнения до прыгать цели). Например, MSVС++ генерирует следующий код, если он требуется 4-байтовое и 6-байтное дополнение:

8d6424 00 lea [ebx + 00], ebx; 4-байтовая прокладка 8d9b 00000000
lea [esp + 00000000], esp; 6-байтовый обивка

Первая строка отмечена как "npad 4" в сборках, сгенерированных компилятор, а второй - "npad 6". Регистры (ebx, esp) могут быть выбраны из редко используемых, чтобы избежать ложные зависимости в коде.

Итак, это всего лишь вид NOP, появляющийся прямо перед целями команд jmp, чтобы выровнять их.

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

Ответ 3

LEA EAX, [EAX]

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

MOV EAX, EAX

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