Я столкнулся с этой инструкцией в двоичном файле, скомпилированном с компилятором Microsoft C. Он явно не может изменить значение EAX. Тогда почему он там?
Ответ 1
Это NOP.
В качестве NOP используются типовые значения. Все они делают то же самое, но в результате получается машинный код разной длины. В зависимости от требования к выравниванию выбирается один из них:
Этот трюк используется компилятором MSVС++ испускать инструкции NOP разная длина (для заполнения до прыгать цели). Например, MSVС++ генерирует следующий код, если он требуется 4-байтовое и 6-байтное дополнение:
Первая строка отмечена как "npad 4" в сборках, сгенерированных компилятор, а второй - "npad 6". Регистры (ebx, esp) могут быть выбраны из редко используемых, чтобы избежать ложные зависимости в коде.
Итак, это всего лишь вид NOP, появляющийся прямо перед целями команд jmp, чтобы выровнять их.
Интересно, что вы можете идентифицировать компилятор от характерного характера таких инструкций.
Ответ 3
LEA EAX, [EAX]
В действительности не изменяется значение EAX. Насколько я понимаю, он идентичен функции:
MOV EAX, EAX
Вы видели это в оптимизированном коде или неоптимизированном коде?