Variablen in Methoden

Implementiert man eine Methode mit Parametern und/oder innerhalb der Methode zusätzliche Variablen, sind Diese lokal auf die Methode bezogen (sie sind nur in der Methode selbst sichtbar). Parameter und temporär dimensionierte Variablen, belegen nur während der Ausführung der Methode den benötigten Speicherplatz im Arbeitsspeicher. Zusätzliche dimensionierte Variablen können in Methoden auch statisch dimensioniert werden.

Siehe hierzu: dim, static

Veranschaulichung

Nehmen wir an es wurde folgene Methode implementiert:

procedure test(a as byte, b as integer)
  dim c,d as byte
  [..]
endproc

Diese Methode reserviert bei Aufruf vier verschiedene temporäre Variablen im Arbeitsspeicher. Als Erstes landen die Parameter auf dem Stack. Dies geschieht von rechts nach links, also umgekehrt wie in der Parameterdefinition der Methode schriftlich angegeben.

Der Ablauf beim Aufruf einer Methode

  1. Rücksprungadresse auf den Stack legen
  2. Parameter „b“ auf den Stack legen
  3. Parameter „a“ auf den Stack legen
  4. Speicherplatz für Variable „d“ auf dem Stack reservieren
  5. Speicherplatz für Variable „c“ auf dem Stack reservieren
  6. Aktuelle Stackposition merken (Zeiger)

Der Compiler weiß beim Erstellen des Programms wo und wieviele Variablen auf dem Stack abgelegt werden und passt die entsprechenden Aufrufe innerhalb der Methode an.

Wird in der Methode auf eine temporäre, lokale Variable zugegriffen, passiert Folgendes:

  1. Zeiger holen
  2. Variablenposition hinzurechnen
  3. Zugriff durchführen

Bei globalen Variablen, sowie bei in der Methode statisch dimensionierten Variablen entfallen die ersten beiden Schritte, wodurch Zugriffe schneller sind. Bei zeitkritischen Zugriffen, sind also globale oder statische, lokale Variablen vorzuziehen, sofern dies technisch möglich ist.

Verlassen der Methode

Beim Verlassen der Methode wird der Stack auf die ursprüngliche Position zurückgesetzt, wobei die Rücksprungadresse auf dem Stack verbleibt. Der abschließende Maschinenbefehl „ret“ (Return) holt sich diese Rücksprungadresse vom Stack und springt dann zu der Position hinter dem Methodenaufruf zurück. Damit ist der auf dem Stack vorübergehend belegte Speicher wieder freigegeben.