Angenommen sei folgende Zeile im Assembler-Code
f(i,j)
Funktion f mit den Paramtern i und j
Dieser Aufruf wird dann folgendermaßen übersetzt:
Load i
Load j
PushJ f
Der Auswertekeller sieht dann wie folgt aus (hierbei ist unten das zuletzt eingefügte Objekt):
Die Funktion f sieht dann wie folgt aus:
f:
Entry (1+2+n) -- Stack Frame erzeugen
Store ra -- Rücksprungaddresse retten
Store j -- Parameter retten
Store i
[...] -- Code des Funktionsrumpfes
Load RA -- Rücksprungaddresse wiederholen
Exit -- Stack Frame löschen
PopJ -- zurückspringen
Berechnung für Entry Int:
1 -> Rückkehradresse, n -> Lokale Variablen, m-> Parameter. Berechnung 1+ m + n
Stack vor dem Aufruf von Exit:
Über Store werden die Rückkehradresse (RA) und die Parameter vom Stack genommen und im Mem (Datenspeicher) abgelegt. Nach der Berechnung in der Funktion wird zunächst das Ergebnis auf den Stack gelegt und danach die Rückkehradresse (Load RA). Über Exit wird dann der für den Funktionsaufruf erstellte Stackframe "zerstört". PopJ nimmt den obersten Wert vom Stack (RA) und springt zu diesem. Auf dem Stack befindet sich nun noch das Ergebnis der Funktion.