Enter / Leave — Änderungen 10232 → 11531

Zeile 7: Zeile 7:
 
=== enter ===
 
=== enter ===
 
''enter'' hat folgende Syntax:
 
''enter'' hat folgende Syntax:
−
<asm>enter operand1, operand2</asm>
+
<syntaxhighlight lang=asm>enter operand1, operand2</syntaxhighlight>
 
Sie lässt sich ersetzen durch:
 
Sie lässt sich ersetzen durch:
−
<asm>push ebp
+
<syntaxhighlight lang=asm>push ebp
 
mov ebp, esp
 
mov ebp, esp
−
sub esp, operand1</asm>
+
sub esp, operand1</syntaxhighlight>
 
''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 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:
 
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:
  
−
<asm>enter operand1, operand2</asm>
+
<syntaxhighlight lang=asm>enter operand1, operand2</syntaxhighlight>
 
Folgender Darstellung in einer Art Pseudocode (wobei "framePtr" ein internes Hilfregister ist):
 
Folgender Darstellung in einer Art Pseudocode (wobei "framePtr" ein internes Hilfregister ist):
−
<asm>
+
<syntaxhighlight lang=asm>
 
push ebp
 
push ebp
 
mov framePtr, esp
 
mov framePtr, esp
−
if (operant2 > 0) then
+
if (operand2 > 0) then
−
     repeat (operant2 - 1) times
+
     repeat (operand2 - 1) times
 
         add ebp, 4
 
         add ebp, 4
 
         push ebp
 
         push ebp
Zeile 29: Zeile 29:
 
end if
 
end if
 
mov ebp, framePtr
 
mov ebp, framePtr
−
sub esp, operant1
+
sub esp, operand1
−
</asm>
+
</syntaxhighlight>
  
 
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.
 
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.
Zeile 36: Zeile 36:
 
=== leave ===
 
=== leave ===
 
''leave'' macht die Änderungen von ''enter'' rückgängig, damit der Aufrufstack wiederhergestellt wird und die Funktion zum Aufrufer zurückkehren kann:
 
''leave'' macht die Änderungen von ''enter'' rückgängig, damit der Aufrufstack wiederhergestellt wird und die Funktion zum Aufrufer zurückkehren kann:
−
<asm>leave</asm>
+
<syntaxhighlight lang=asm>leave</syntaxhighlight>
 
Sie lässt sich ersetzen durch:
 
Sie lässt sich ersetzen durch:
−
<asm>mov esp, ebp
+
<syntaxhighlight lang=asm>mov esp, ebp
−
pop ebp</asm>
+
pop ebp</syntaxhighlight>
 
== Umsetzung in verschiedenen Compilern ==
 
== Umsetzung in verschiedenen Compilern ==
 
=== gcc ===
 
=== gcc ===