| Zeile 13: | Zeile 13: | ||
sub esp, operand1</asm> | sub esp, operand1</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 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: | ||
| + | |||
| + | <asm>enter operand1, operand2</asm> | ||
| + | Folgender Darstellung in einer Art Pseudocode (wobei "framePtr" ein internes Hilfregister ist): | ||
| + | <asm> | ||
| + | push ebp | ||
| + | mov framePtr, esp | ||
| + | if (operant2 > 0) then | ||
| + | repeat (operant2 - 1) times | ||
| + | add ebp, 4 | ||
| + | push ebp | ||
| + | end repeat | ||
| + | push framePtr | ||
| + | end if | ||
| + | mov ebp, framePtr | ||
| + | sub esp, operant1 | ||
| + | </asm> | ||
| + | |||
| + | 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 === | ||