Das Befehlspaar ''enter'' und ''leave'' adjustiert den [[Stack]] für die Verwendung von lokalen Variablen. == Funktionsweise == Das Befehlspaar ''enter''/''leave'' war nicht zwingend notwendig, da man sie durch mehrere Befehle ersetzen kann. Da aber diese Befehlsfolge von vielen Hochsprachen häufig verwendet wurde, hat man dieses spezielle Befehlspaar eingeführt. === enter === ''enter'' hat folgende Syntax: enter operand1, operand2 Sie lässt sich ersetzen durch: push ebp mov ebp, esp sub esp, operand1 ''operand1'' gibt also an, wieviel Speicherplatz auf dem Stack für lokale Variablen freigehalten werden soll. ''operand2'' steht für die Verschachtelungstiefe und kann auf 0 gesetzt werden. Wird der zweite Operand verwende (sprich <> 0) wird die Struktur komplizierter. In dieser Kombination wird der Befehl kann dieser Befehl dazu genutzt werden, eine Verschachtelte Funktion. Dabei entspricht: enter operand1, operand2 Folgender Darstellung in einer Art Pseudocode (wobei "framePtr" ein internes Hilfregister ist): push ebp mov framePtr, esp if (operand2 > 0) then repeat (operand2 - 1) times add ebp, 4 push ebp end repeat push framePtr end if mov ebp, framePtr sub esp, operand1 Die Funktion schiebt also nach zwischen dem Framepointer (der Position auf die ebp nachher zeigt.) und dem Speicherplatz für lokale Variablen noch einen Block der die Framepointer von operant2 darüber liegenden Funktionen abschießend mit sich selbst. === leave === ''leave'' macht die Änderungen von ''enter'' rückgängig, damit der Aufrufstack wiederhergestellt wird und die Funktion zum Aufrufer zurückkehren kann: leave Sie lässt sich ersetzen durch: mov esp, ebp pop ebp == Umsetzung in verschiedenen Compilern == === gcc === [[gcc]] verwendet nur den ''leave''-Befehl, anstatt ''enter'' aber die obige Ersatzform. == siehe auch == * [[Stack]] [[Kategorie:x86-Befehle]]