LEAVE
is the counterpart to ENTER
. The ENTER
instruction sets up a stack frame by first pushing EBP
onto the stack and then copies ESP
into EBP
, so LEAVE
has to do the opposite, i.e. copy EBP
to ESP
and then restore the old EBP
from the stack.
See the section named PROCEDURE CALLS FOR BLOCK-STRUCTURED LANGUAGES in Intel's Software Developer's Manual Vol 1 if you want to read more about how ENTER
and LEAVE
work.
enter n,0
is exactly equivalent to (and should be replaced with)
push %ebp
mov %esp, %ebp # ebp = esp, mov ebp,esp in Intel syntax
sub $n, %esp # allocate space on the stack. Omit if n=0
leave
is exactly equivalent to
mov %ebp, %esp # esp = ebp, mov esp,ebp in Intel syntax
pop %ebp
enter
is very slow and compilers don't use it, but leave
is fine. (http://agner.org/optimize). Compilers do use leave
if they make a stack frame at all (at least gcc does). But if esp
is already equal to ebp
, it's most efficient to just pop ebp
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…