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