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

Tag 102 von 365 · Fortgeschritten · Monat 4: Netzwerk im Detail

Indirekt: dr0 und rr0

dr0 ist der Pin, dessen Nummer in r0 steht, rr1 das Register, dessen Nummer in r1 steht. Damit läuft eine Schleife über alle Pins und füllt eine Tabelle.

Lektion 14 Min. Woche 15

Das lernst du heute

  • Pin-Nummer aus einem Register
  • Register über Register
  • Schleife über Pins

Im Schaltschrank hängen vier Sensoren an d0 bis d3. Vier fast gleiche Blöcke zu schreiben, ist lästig, und mit sechs Pins wird es nicht schöner. Besser: Die Pinnummer steht in einem Register, und eine Schleife geht sie durch.

dr0: Pin aus einem Register

dr2 heißt: der Pin, dessen Nummer gerade in r2 steht. Steht in r2 eine 3, ist dr2 dasselbe wie d3.

move i 0
pin:
l temp dr0 Temperature    # dr0: Pin mit der Nummer aus r0
add i i 1
blt i 4 pin

Das funktioniert überall, wo ein Pin stehen darf: l, s, ls, sdse, bdns und so weiter.

Achtung

In dr0 steht die Registernummer, nicht der alias. Ist i ein alias für r0, heißt der Pin trotzdem dr0. Ein dri gibt es nicht. Legt jemand den alias auf ein anderes Register, muss dr0 mitwandern.

rr1: Register über Register

Dasselbe gibt es für Register. rr1 heißt: das Register, dessen Nummer in r1 steht.

move r1 10
move rr1 42        # schreibt 42 nach r10
add r1 r1 1
move rr1 43        # schreibt 43 nach r11

So legst du eine kleine Tabelle in den Registern an, etwa die Temperaturen von vier Pins in r10 bis r13. Mehrere r gehen auch: rrr1 liest erst r1, nimmt den Wert als Registernummer, liest dort und nimmt diesen Wert als Nummer.

Liegt eine Registernummer außerhalb von 0 bis 17, meldet der Chip OutOfRegisterBounds. Eine Pinnummer außerhalb von 0 bis 5 führt ebenfalls zu einem Fehler.

Schleife über Pins

Zusammen ergibt das eine Schleife, die jeden Pin prüft, liest und den Wert in ein eigenes Register legt:

move i 0
pin:
add ziel i 10          # Zielregister r10 bis r13
move rr1 0             # Startwert, falls der Pin leer ist
bdns dr0 weiter
l rr1 dr0 Temperature
weiter:
add i i 1
blt i 4 pin

Hier ist i ein alias für r0 und ziel ein alias für r1.

Tipp

Für Tabellen mit mehr als ein paar Einträgen ist der Stack besser. Register sind knapp, und rr frisst sie schnell. Der Stack kommt in Woche 18.

Schaubild

Die Registerbank des Chips r0 42 r1 31 r2 10 r3 -2.5 r4 0 r5 0 r6 0 r7 0 r8 0 r9 0 r10 0 r11 0 r12 0 r13 0 r14 0 r15 0 sp = r16 ra = r17 16 freie Register, je eine Zahl sp: Stapelzeiger · ra: Rücksprungadresse
Ein zusätzliches r vor dem Register heißt: Nimm den Inhalt als Nummer. dr0 wählt so einen Pin, rr1 ein Register.

Übung

Aufgabe

An d0 bis d3 können Gassensoren hängen, manche Pins sind leer.

  • Lies in einer Schleife über die Pins die Temperaturen nach r10 bis r13 (Pin d0 → r10 usw.), mit dr0 und rr1.
  • Ein leerer Pin ergibt 0 in seinem Register.
  • Schreib die höchste Temperatur (in K) als Setting aufs Gehäuse (db), 0 wenn kein Sensor da ist.

Hinweise

Hinweis 1

i ist r0, also heißt der Pin dr0. ziel ist r1, also heißt das Zielregister rr1.

Hinweis 2

In der Schleife: add ziel i 10, move rr1 0, bdns dr0 weiter, l rr1 dr0 Temperature.

Hinweis 3

Das Maximum sammelst du mit max hoechst hoechst rr1.

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