Почему оставить "mov esp, ebp" в сборке x86?
Он сказал, что команда leave
такая же, как:
mov esp,ebp
pop ebp
Но для чего здесь mov esp,ebp
? Мне это не кажется...
Ответы
Ответ 1
mov esp,ebp
устанавливает указатель стека на адрес базового кадра, эффективно освобождая весь кадр. (Не забывайте, что это синтаксис Intel, пункт назначения на первом месте.) Если вы этого не сделали, как только вы вызовете ret
, вы все равно будете использовать фрейм стека вызываемых функций с вашей вызывающей функцией с кратковременными последствиями.
Ответ 2
Я думаю, что ваша проблема заключается в том, что существует два разных способа написания сборки x86. Один из них - AT & T-нотация, а другой - нотация Intel. Порядок аргументов для команды отменяется в нотации Intel, в отличие от AT & T. Ваша версия сборки отображается в нотации Intel, что означает, что mov esp, ebp
actaully перемещает значение в ebp
в esp
. В более логичной (на мой взгляд) AT & T обозначении было бы mov %ebp, %esp
.
Ответ 3
Компилятор использует эту инструкцию для освобождения используемого пространства функцией в стеке, инструкция leave
имеет то же поведение, что и mov esp, ebp
с pop ebp
.