Das lernst du heute
- Register mehrfach nutzen
- Zwischenwerte vermeiden
- Stack als Auslagerung
Die Basis wächst. Drei Räume mit eigener Heizung, dazu Pumpen, Lampen und Anzeigen – und irgendwann zeigt dein Registerplan: alle 16 belegt. sp und ra zählen nicht mit, die brauchst du für Stack und Unterprogramme. Ein zweiter Chip wäre eine Lösung. Meist reicht es aber, sparsamer mit den Registern umzugehen.
Was wirklich ein Register braucht
Ein Register brauchst du nur für Werte, die sich zur Laufzeit ändern und die du später noch einmal brauchst. Alles andere kostet nichts:
| Was | Register? |
|---|---|
| Schwellwert, Prefab-Hash, Gerätename | nein – define |
| Zwischenergebnis, das gleich weitergeht | ein gemeinsames tmp |
| Messwert, der nur in dieser Runde zählt | ja, aber jede Runde neu |
| Zustand, der über Takte erhalten bleibt | ja – oder Stack |
Ein alias ist nur ein Name, er reserviert nichts. Zwei alias auf dasselbe Register sind deshalb zwei Namen für einen Speicher: Steht aus Versehen alias druck r3 unter alias temp r3, überschreibt jeder Druckwert still die Temperatur.
Register mehrfach nutzen
Ein Hilfsregister wie tmp darf in jeder Zeile etwas anderes bedeuten, solange du den alten Inhalt nicht mehr brauchst. Am meisten spart ein Unterprogramm, das für mehrere Räume dieselben Register benutzt:
move name HASH("Raum1") # Eingabe: welcher Raum
jal raum
move name HASH("Raum2")
jal raum # gleiche Register, anderer Raum
Statt drei Sätzen mit Temperatur, Zustand und Hilfswert brauchst du einen.
Zwischenwerte vermeiden
Viele Rechnungen kommen ohne eigenes Ergebnisregister aus. Rechne im selben Register weiter und schreib das Ergebnis direkt an das Gerät:
lbn t SENSOR HASH("Lager") Temperature Average
sub t t CELSIUSOFFSET # in Grad C, gleiches Register
slt tmp t FROST # zu kalt?
sbn LAMPE HASH("Frost") On tmp # sofort raus, nicht aufheben
Der Stack als Ablage
Was über mehrere Takte erhalten bleiben muss, aber nicht ständig gebraucht wird, legst du in den Stack. Mit get und put an festen Adressen bleibt sp unberührt:
define ADR_RAUM1 0 # Stack-Platz fuer Zustand Raum1
get heiz db ADR_RAUM1 # Zustand holen
put db ADR_RAUM1 heiz # Zustand zuruecklegen
Ein Platz im Stack ersetzt so ein Register, das sonst die ganze Laufzeit über belegt wäre. Jeder Zugriff kostet dafür eine Zeile.
Feste Adressen und push teilen sich denselben Speicher. sp startet bei 0 – das erste push überschreibt also Platz 0, auf dem vielleicht dein Zustand liegt. Benutze nur eines von beiden oder leg die festen Plätze ans obere Ende, zum Beispiel ab Adresse 500.
Mit push und pop räumst du Register auch kurz frei, etwa um ein Unterprogramm herum. pop holt in umgekehrter Reihenfolge zurück: Nach push a und push b kommt erst pop b, dann pop a.
Übung
Aufgabe
Drei Räume „Raum1“, „Raum2“ und „Raum3“ haben je einen Gassensor und eine Wandheizung mit demselben Namen. Jede Heizung arbeitet mit Hysterese: an unter 19 °C, aus über 21 °C, dazwischen bleibt sie, wie sie war.
Das Unterprogramm raum wird für alle drei Räume mit denselben Registern aufgerufen: name ist der Name-Hash, adr der Stack-Platz des Raums (0, 1 oder 2).
Damit sich die Räume nicht gegenseitig den Zustand überschreiben, liegt er im Stack. Ergänze im Unterprogramm: Zustand mit get holen, Hysterese rechnen, Zustand mit put zurücklegen.
Hinweise
Hinweis 1
get heiz db adr holt den Zustand des Raums, put db adr heiz legt ihn zurück.
Hinweis 2
Hysterese wie gewohnt: slt tmp t AUS und and heiz heiz tmp, dann slt tmp t AN und or heiz heiz tmp.
Hinweis 3
Ohne Stack lebt der Zustand von Raum1 in Raum2 weiter – genau das prüft der zweite Test.
Quiz
5 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