Почему leave do mov esp, ebp в сборке x86?

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

mov esp,ebp
pop ebp

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


person compile-fan    schedule 29.03.2011    source источник
comment
stackoverflow.com/questions/579262/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 12.08.2015


Ответы (3)


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

person zneak    schedule 29.03.2011
comment
Извините, но не mov esp,ebp устанавливает ли базовый указатель на адрес указателя стека? mov ebp,esp обновит указатель стека, чтобы он указывал на базовый фрейм. - person DIMMSum; 10.06.2015
comment
@Decave, это зависит от того, используете ли вы разборку в стиле AT&T или разборку в стиле Intel. Поскольку инструкции не имеют суффиксов длины и регистры не имеют префикса %, мы говорим о стиле Intel, где на первом месте находится пункт назначения. Эквивалентная разборка в стиле AT&T для этого вопроса, о котором вы, вероятно, думаете и о том, где пункт назначения находится в последнюю очередь, будет movl %ebp, %esp. - person zneak; 10.06.2015
comment
Ну конечно. Большое спасибо за ваше объяснение. - person DIMMSum; 10.06.2015

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

person Abhay Buch    schedule 29.03.2011
comment
Это тоже было бы movd вместо mov. - person zneak; 29.03.2011
comment
Логичнее будет рассматривать семантику как move ebp into esp. Нотация Intel (которая предшествует Intel на определенное время - например, 16-разрядная серия Interdata, восходящая к 60-м годам, использует именно этот формат и ни в коем случае не была первой ...) имеет семантику, больше похожую на move such that esp = ebp. - person JUST MY correct OPINION; 29.03.2011
comment
@zneak, неверно. movd на самом деле является инструкцией MMX. Если вы хотите добавить суффикс размера (который в данном случае является необязательным, заметьте), вы должны использовать movl - person bug; 16.10.2012
comment
На самом деле обозначения в стиле Intel гораздо более распространены. Все остальные языки ассемблера, которые я знаю, имеют приоритетное назначение. Вы можете думать об этом как о задании. esp = ebp - person phuclv; 12.08.2013
comment
Я рано понял, что сборка Intel X86 использует то, что мы называли обратной польской нотацией, что вызвало большую путаницу среди крупных бизнес-специалистов, которые привыкли к более английской нотации справа налево, используемой в алгебре, и для работы с калькуляторами Texas Instruments. И наоборот, калькуляторы Hewlett-Packard обслуживали инженеров и использовали обратную польскую нотацию. Когда я начал учиться использовать различные ассемблеры, я вскоре обнаружил, что большинство из них также используют обратную полировку. Это включало сборку Univac Exec-8 и IBM BAL (базовый язык сборки), используемые на мэйнфреймах класса IBM 360/370. - person David A. Gray; 28.05.2016
comment
@ DavidA.Gray: Точно не RPN, в RPN операнды предшествуют операции, я не знаю ни одного языка ассемблера, который бы это делал. - person Ben Voigt; 09.04.2018

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

person kabab    schedule 12.08.2013
comment
Разве enter и leave не могут оба использоваться для освобождения используемого пространства в стеке? - person Pascal Cuoq; 31.10.2014
comment
Да вы правы, просто оставьте инструкцию, я ошибся - person kabab; 20.11.2014