Какой смысл LEA EAX, [EAX]? - PullRequest
43 голосов
/ 24 апреля 2010
LEA EAX, [EAX]

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

Ответы [ 3 ]

81 голосов
/ 24 апреля 2010

Это NOP.

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

xchg eax, eax         = 90
mov eax, eax          = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 
34 голосов
/ 24 апреля 2010

С это артикул:

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

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

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

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

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

3 голосов
/ 24 апреля 2010
LEA EAX, [EAX]

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

MOV EAX, EAX

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

...