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.
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.
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
Ü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
rainpruefenmitpush raund hol es vor dem Rücksprung mitpop razurü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
spwieder 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