Какой смысл 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
Вы видели это в оптимизированном коде или неоптимизированном коде?