Говорят, что инструкция leave
такая же, как:
mov esp,ebp
pop ebp
Но для чего здесь mov esp,ebp
? Мне это кажется несостоятельным ...
Говорят, что инструкция leave
такая же, как:
mov esp,ebp
pop ebp
Но для чего здесь mov esp,ebp
? Мне это кажется несостоятельным ...
mov esp,ebp
устанавливает указатель стека на адрес базового кадра, фактически освобождая весь кадр. (Не забывайте, что это синтаксис Intel, адресат идет первым.) Если бы вы этого не сделали, после вызова ret
вы все равно использовали бы фрейм стека вызываемой функции с вызывающей функцией, что привело бы к аварийным последствиям.
mov esp,ebp
устанавливает ли базовый указатель на адрес указателя стека? mov ebp,esp
обновит указатель стека, чтобы он указывал на базовый фрейм.
- person DIMMSum; 10.06.2015
%
, мы говорим о стиле Intel, где на первом месте находится пункт назначения. Эквивалентная разборка в стиле AT&T для этого вопроса, о котором вы, вероятно, думаете и о том, где пункт назначения находится в последнюю очередь, будет movl %ebp, %esp
.
- person zneak; 10.06.2015
Я думаю, ваша проблема в том, что есть два разных способа написания сборки x86. Один - это обозначение AT&T, а другое - обозначение Intel. Порядок аргументов инструкции в нотации Intel обратный, а не AT&T. Ваша версия сборки выглядит в нотации Intel, что означает, что mov esp, ebp
фактически перемещает значение в ebp
на esp
. В более логичной (на мой взгляд) нотации AT&T это было бы mov %ebp, %esp
.
movd
вместо mov
.
- person zneak; 29.03.2011
move ebp into esp
. Нотация Intel (которая предшествует Intel на определенное время - например, 16-разрядная серия Interdata, восходящая к 60-м годам, использует именно этот формат и ни в коем случае не была первой ...) имеет семантику, больше похожую на move such that esp = ebp
.
- person JUST MY correct OPINION; 29.03.2011
movd
на самом деле является инструкцией MMX. Если вы хотите добавить суффикс размера (который в данном случае является необязательным, заметьте), вы должны использовать movl
- person bug; 16.10.2012
esp = ebp
- person phuclv; 12.08.2013
Компилятор использует эту инструкцию, чтобы освободить пространство, используемое функцией в стеке, инструкция leave
имеет то же поведение, что и mov esp, ebp
с pop ebp
.
enter
и leave
не могут оба использоваться для освобождения используемого пространства в стеке?
- person Pascal Cuoq; 31.10.2014