Почему leave делает "mov esp, ebp" в сборке x86?


говорят, что leave инструкция такая же, как:

mov esp,ebp
pop ebp

но что такое mov esp,ebp здесь? Это не кажется мне действительным...

3 60

3 ответа:

mov esp,ebp устанавливает указатель стека на адрес базового кадра, эффективно освобождая весь кадр. (Не забывайте, что это синтаксис Intel, назначение на первом месте.) Если вы этого не сделали, сразу звоните ret, вы все равно будете использовать фрейм стека вызываемой функции с вызывающей функцией, с последствиями crashtastic.

Я думаю, что ваша проблема заключается в том, что есть два разных способа написания ассемблера x86. Одним из них является в нотации&T и других обозначений процессоров Intel. Порядок аргументов в инструкции отменяется в нотации Intel в отличие от AT&T. ваша версия сборки, по-видимому, находится в нотации Intel, что означает, что mov esp, ebp actaully перемещает значение в ebp to esp. В более логичной (на мой взгляд) нотации AT&T это было бы mov %ebp, %esp.

компилятор использует эту инструкцию для освобождения используемого пространства функцией в стеке leave инструкция имеет то же поведение, что и mov esp, ebp С pop ebp.