Milliarden kleiner Schritte
Wenn du an der Supermarktkasse mit dem Handy zahlst, arbeitet sein Prozessor Befehle ab. Er schafft Milliarden davon in jeder Sekunde.
Jeder Befehl ist winzig, etwa „addiere diese zwei Zahlen“. Und jeder durchläuft dieselben drei Schritte. Heute siehst du ihnen einzeln zu.
Am Ende dieser Lektion
Notiz
Ich kann dem Befehlszyklus aus Holen, Decodieren und Ausführen folgen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Befehl | ein kleiner Schritt, den ein Prozessor ausführen kann | add a0, a0, a1 |
| Speicheradresse | die Nummer eines Platzes im Speicher | |
| Register | ein winziger, schneller Speicher im Prozessor | a0 |
| Befehlszähler | das Register mit der Adresse des nächsten Befehls | |
| Assembler-Sprache | die Befehle eines Prozessors als kurze Wörter geschrieben | |
| Zyklus | dieselben Schritte, immer wieder |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Was in einem Prozessor steckt
Ein Programm wartet im Speicher als Liste von Befehlen, jeder an seiner eigenen Speicheradresse.
Der Prozessor hat ein Steuerwerk, das jeden Befehl liest und herausfindet, was zu tun ist. Er hat ein Rechenwerk, auch ALU genannt, das addiert und vergleicht. Es ist aus Gattern wie in der letzten Lektion gebaut. Und er hat Register, winzige Speicher für die Zahlen, mit denen er gerade arbeitet.
Die Teile und ihre Aufgaben
| Teil | Seine Aufgabe |
|---|---|
| Speicher | Hält das Programm und seine Daten |
| Befehlszähler | Hält die Adresse des nächsten Befehls |
| Steuerwerk | Findet heraus, was ein Befehl bedeutet |
| Rechenwerk (ALU) | Addiert, subtrahiert und rechnet mit Logik |
| Register wie a0 und a1 | Halten die Zahlen, mit denen gerechnet wird |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Holen, Decodieren, Ausführen, und wieder
Holen: Der Prozessor kopiert den Befehl, der an der Adresse im Befehlszähler steht. Der Befehlszähler rückt zur nächsten Adresse weiter.
Decodieren: Das Steuerwerk findet heraus, was der Befehl verlangt. Ausführen: Der Prozessor tut es, zum Beispiel addiert das Rechenwerk zwei Register. Dann beginnt der Zyklus von vorn.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten und warte, bis die Maschine läuft. Das Programm, das du liest, ist für einen RISC-V-Prozessor geschrieben. Die Lab-Maschine ist kein RISC-V, darum führt ein Emulator es aus.
In den Ordner arch wechseln
cd ~/archHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Programm aus fünf Befehlen lesen
cat add.sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Aus Wörtern Maschinencode machen
riscv64-linux-gnu-as add.s -o add.oHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Daraus ein Programm machen
riscv64-linux-gnu-ld add.o -o addHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jeden Befehl an seiner Adresse sehen
riscv64-linux-gnu-objdump -d addHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: das Programm Schritt für Schritt
| Befehlszähler | Befehl | Was Ausführen tut | a0 | a1 |
|---|---|---|---|---|
| 100b0 | li a0,2 | legt 2 in a0 | 2 | ? |
| 100b4 | li a1,3 | legt 3 in a1 | 2 | 3 |
| 100b8 | add a0,a0,a1 | das Rechenwerk addiert beide nach a0 | 5 | 3 |
| 100bc | li a7,93 | wählt den Aufruf, der ein Programm beendet | 5 | 3 |
| 100c0 | ecall | bittet Linux, es mit Status a0 zu beenden | 5 | 3 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, der Befehlszähler zählt, wie viele Befehle schon gelaufen sind. Er hält aber die Adresse des nächsten Befehls. Hier steigt er jedes Mal um 4, weil jeder Befehl 4 Bytes lang ist. Ein Sprung schreibt stattdessen eine neue Adresse hinein.
Eine Kopie mit 20 statt 2
sed 's/a0, 2/a0, 20/' add.s > zwanzig.sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Deine Kopie assemblieren
riscv64-linux-gnu-as zwanzig.s -o zwanzig.oHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Deine Kopie linken
riscv64-linux-gnu-ld zwanzig.o -o zwanzigHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Vorhersagen, dann im Emulator starten
qemu-riscv64 ./zwanzigHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Ergebnis lesen, das es hinterließ
echo $?Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Weiterführend: subtrahieren statt addieren
Drück auf Terminal öffnen und tipp sed 's/add /sub /' add.s > minus.s. Das macht eine Kopie, die a0 minus a1 rechnet, also 2 minus 3.
Assembliere und linke minus.s wie vorhin und starte das Programm mit qemu-riscv64 ./minus. Was zeigt echo $? danach? Erinnere dich an Lektion 2.