stationeers.de Mod-Werkstatt · Dominik1199
EN Anmelden
  1. Start
  2. IC10-Akademie
  3. Tag 128

Tag 128 von 365 · Fortgeschritten · Monat 5: Speicher und Struktur

Verschachtelte Aufrufe

Ruft ein Unterprogramm ein zweites auf, überschreibt jal das ra. push ra am Anfang und pop ra vor dem Rücksprung retten die Rückfahrkarte.

Lektion 13 Min. Woche 19

Das lernst du heute

  • ra auf den Stack retten
  • pop ra vor dem Rücksprung
  • Tiefe begrenzen

Das Unterprogramm pruefen zeigt die Temperatur an und warnt bei Kälte. Für die Umrechnung ruft es selbst ein zweites Unterprogramm auf, celsius. Kaum ist das eingebaut, kommt der Chip nie mehr in der Hauptschleife an.

Was mit ra passiert

jal schreibt die Rücksprungadresse in ein einziges Register: ra. Ruft pruefen mit jal celsius ein zweites Unterprogramm auf, überschreibt es dabei die Adresse, die die Hauptschleife hinterlegt hat. Das j ra am Ende von pruefen springt dann nicht zurück in die Hauptschleife, sondern hinter jal celsius, also mitten in pruefen. Der Chip dreht sich im Kreis, ohne je ein yield zu erreichen.

ra auf den Stack retten

Die Lösung: Jedes Unterprogramm, das selbst jal benutzt, legt ra beim Eintritt auf den Stack und holt es vor dem Rücksprung zurück.

pruefen:
push ra          # Rueckfahrkarte sichern
jal celsius      # ueberschreibt ra
sbn ANZEIGE HASH("Labortemp") Setting c
pop ra           # Rueckfahrkarte zurueck
j ra

celsius ruft nichts weiter auf. Es braucht kein push ra, sein j ra führt sauber zurück in pruefen.

Tiefe begrenzen

Jede Ebene, die ra sichert, belegt einen Platz im Stack, bis sie zurückkehrt. Drei Ebenen sind drei Plätze, das ist harmlos. Gefährlich wird es, wenn ein Unterprogramm sich selbst aufruft und kein Ende findet: Dann wächst der Stack bis zum StackOverFlow.

Halte die Tiefe klein, zwei oder drei Ebenen reichen für fast alles. Tiefer verschachtelter Code ist auch für Menschen schwer zu verfolgen.

Achtung

push ra und pop ra müssen paarweise auf jedem Weg durch das Unterprogramm stehen. Springt ein Weg ohne pop ra mit j ra heraus, stimmt danach weder ra noch sp.

Tipp

Benutzt das Unterprogramm selbst push und pop für Zwischenwerte, gilt dieselbe Regel: Was es auflegt, nimmt es vor dem pop ra wieder herunter. Sonst holt pop ra den falschen Wert.

Schaubild

Aufruf und Rücksprung eines Unterprogramms Hauptschleife 2 l r0 d0 Temperature 3 jal celsius 4 s d2 Setting r1 5 l r0 d1 Temperature 6 jal celsius 7 s d3 Setting r1 8 j start celsius: sub r1 r0 273.15 j ra ra = 4 zurück zu Zeile ra
Jede Ebene legt ihr ra auf den Stack und holt es vor j ra zurück. So findet jede Ebene wieder heim.

Übung

Aufgabe

Im Editor ruft die Hauptschleife das Unterprogramm pruefen auf, und pruefen ruft celsius auf. So wie der Code dasteht, kommt der Chip nie in die Hauptschleife zurück.

  • Sichere ra in pruefen mit push ra und hol es vor dem Rücksprung mit pop ra zurück.
  • LED „Labortemp“ zeigt die Temperatur des Gassensors „Labor“ in °C, ohne Sensor −999.
  • Blinklicht „Laborwarnung“ an unter 10 °C und bei Sensorausfall. Nach jedem Durchlauf ist sp wieder 0.

Hinweise

Hinweis 1

Spiel den Ablauf durch: Was steht in ra, wenn pruefen sein j ra erreicht?

Hinweis 2

push ra gehört an den Anfang von pruefen, vor jal celsius.

Hinweis 3

pop ra direkt vor dem j ra von pruefen.

Quiz

4 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.

Tag abschließen

  • Übung im Simulator bestanden
  • Quiz mit mindestens 60 % bestanden

Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.

Fehler in dieser Lektion melden

Zum Melden bitte anmelden. Anmelden

Esc
↑ ↓ wählenEnter öffnen/ öffnet die Suche überall