Почему оставить "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.