| Zeile 1: | Zeile 1: | ||
| − | Das Befehlspaar ''enter'' und ''leave'' adjustiert den [[Stack]] für die Verwendung von | + | Das Befehlspaar ''enter'' und ''leave'' adjustiert den [[Stack]] für die Verwendung von lokalen Variablen. |
== Funktionsweise == | == Funktionsweise == | ||
| − | Das Befehlspaar enter/ | + | 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 === | ||
| − | + | ''enter'' hat folgende Syntax: | |
| − | <asm> | + | <asm>enter operand1, operand2</asm> |
| − | enter operand1, operand2 | ||
| − | </asm> | ||
Sie lässt sich ersetzen durch: | Sie lässt sich ersetzen durch: | ||
| − | <asm> | + | <asm>push ebp |
| − | push ebp | ||
mov ebp, esp | mov ebp, esp | ||
| − | sub esp, operand1 | + | sub esp, operand1</asm> |
| − | </asm> | + | ''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. |
| − | ''operand1'' gibt also an, wieviel Speicherplatz auf dem Stack freigehalten werden soll | ||
=== leave === | === leave === | ||
| − | + | ''leave'' macht die Änderungen von ''enter'' rückgängig, damit der Aufrufstack wiederhergestellt wird und die Funktion zum Aufrufer zurückkehren kann: | |
| − | <asm> | + | <asm>leave</asm> |
| − | leave | ||
| − | </asm> | ||
Sie lässt sich ersetzen durch: | Sie lässt sich ersetzen durch: | ||
| − | <asm> | + | <asm>mov esp, ebp |
| − | mov esp, ebp | + | pop ebp</asm> |
| − | pop ebp | ||
| − | </asm> | ||
== Umsetzung in verschiedenen Compilern == | == Umsetzung in verschiedenen Compilern == | ||
=== gcc === | === gcc === | ||
| Zeile 34: | Zeile 26: | ||
== siehe auch == | == siehe auch == | ||
* [[Stack]] | * [[Stack]] | ||
| − | |||
[[Kategorie:x86-Befehle]] | [[Kategorie:x86-Befehle]] | ||