Почему в сборке x86 оставьте команду "mov esp, ebp"? - PullRequest
62 голосов
/ 29 марта 2011

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

mov esp,ebp
pop ebp

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

Ответы [ 3 ]

90 голосов
/ 29 марта 2011

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

4 голосов
/ 29 марта 2011

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

1 голос
/ 12 августа 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...