Почему в сборке 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,

Другие вопросы по тегам