µRISCy Tutorial
Einführung:
Mit diesem Tutorial sollen Sie eine Antwort auf die Frage bekommen: "Wie funktioniert ein
Computer". Es wird vorausgesetzt, dass Sie in einer vorgängigen Schulstunde gelernt
haben, was eine CPU (Central Processing Unit = Zentraleinheit), die ALU (Arithmetic and
Logic Unit = Rechenwerk), das Memory (Speicher für Programm und Daten) sowie I/O
(Input/Output = Ein-/Ausgabe) ist. Und dass der PC (Program Counter = Programmzähler)
einen Befehl im Speicher nach dem anderen adressiert.
Und so ist das Tutorial gedacht ...
1. Lesen Sie die Beschreibung jedes Abschnittes Tutor00 bis Tutor20 durch und ergänzen
Ihr Wissen durch die zugehörigen Hilfe-Kapitel.
2. Laden Sie, wo vorgesehen, das zugehörige Programm ([Link]) aus dem
Directory TUTORIAL. Lassen Sie die Originale unverändert.
3. Stellen Sie die Parameter wie beschrieben ein und beobachten die in der Aufgabe
angegebenen Schritte. Für einige Aufgaben sind Tabellen vorbereitet, die Sie ausdrucken
und ausfüllen können. [Leider fehlen in dieser Helpdatei die Tabellenränder. Benützen Sie
zum Ausdrucken die Word-Version dieses Tutorials]. Verändern Sie das Programm nach
Belieben und schauen, ob sich µRISCy so verhält, wie Sie sich das vorstellen. Falls Sie
Ihre Version speichern wollen, wählen Sie einen anderen Filenamen. Achtung: Original-
Dateien nicht überschreiben.
4. An geeigneten Stellen werden Ihnen kleine Programmieraufgaben gestellt. Laden Sie
die Lösung ([Link]) erst, wenn Ihr eigenes Programm läuft (oder wenn Sie gar
nicht weiter kommen).
-1-
µRISCy Tutor00: Erstes Erfolgserlebnis
Laden (öffnen) Sie im Editor des µRISCy das Programm [Link] aus dem
Verzeichnis TUTORIAL.
.RAF steht für RISC-Assembler-File. Das ist eine Text-Datei, welche den Quellencode für
das µRISCy-Maschinen-Programm enthält.
Das Programm besteht aus neun Sound-Befehlen und dem Stop-Befehl.
Die Sound-Befehle sind keine eigentlichen Maschinen-Befehle, sondern rufen das
"µRISCy-Betriebssystem" auf (solche Befehle heissen je nach Betriebssystem OS-Call,
System-Call, Trap, Interrupt, ..) und lassen dieses die Sound-Datei [Link] spielen.
Diese Befehle helfen bei den nachfolgenden Übungen, den Programmablauf zu verfolgen
("to trace") oder den Abschluss von "langen" Berechnungen anzuzeigen. Auch der Befehl
"speed" ist ein OS-Call, der die Simulator-Parameter einstellt.
Mit dem Menü-Befehl ASSEMBLIEREN wird das Programm übersetzt und in den Speicher
geladen. Die µRISCy-Programme starten immer bei der Adresse 0. In den Tutor-
Programmen wird oft mit dem speed-Befehl die richtige Einstellung gemacht.
Stellen Sie die Optionen und die Geschwindigkeit gemäss den Angaben im Programm ein.
Zum Starten des Programms drücken Sie den Steuerknopf ganz rechts ("Ausführen bis
STOP") und lassen sich überraschen.
-2-
µRISCy Tutor01: Programm übersetzen und laden
Laden Sie das Programm [Link], das Sie für die nächsten drei Übungen
brauchen.
Das Programm zählt in einer Variable "Zähler" in 5er-Schritten nach oben. Die einzelnen
Statements (Anweisungen, Assemblerbefehle) sind im Programm selber beschrieben.
Können Sie's nachvollziehen?
Wie Sie das Programm assemblieren (=zusammenstellen, übersetzen), haben Sie in der
ersten Übung schon gesehen.
Nun schauen Sie den Speicher an und vergleichen mit dem Programm. Ein paar Hinweise:
Der Speicherplatz 1 ist mit dem Label (Marke) "loop" angeschrieben. "loop" ist ein Symbol
für die Adresse 1. "jmp loop" wird vom Assembler deshalb übersetzt mit "145" für "jmp"
(Speicherplatz 7) und "001" als Sprungadresse "loop" (Speicherplatz 8).
Konstanten ("#5", Speicherplatz 4) werden direkt hinter dem Befehl ("add") abgelegt. Man
sagt dieser Art der Adressierung deshalb "immediate" (unmittelbar). Zum verständlichen
Lesen sagen Sie für "#5" besser "Konstante 5". Der Gartenhag "#" heisst übrigens
"number sign", also "Zeichen für eine Nummer oder Zahl".
Auch "Zähler" ist ein Symbol, nämlich für die Adresse 9, und stellt eine Variable dar. Auf
"Zähler" beziehen sich die Befehle "lda" (Speicherplätze 1 und 2) und "sta" (Speicherplätze
5 und 6).
Der Platz für "Zähler" wurde vom Assembler zugewiesen, und zwar wurde der Speicher
ganz einfach von unten her gefüllt mit dem, was im Programm steht. Das sind i. a. zuerst
die Befehle, dann die Variable(n).
Sie sehen: im Speicher sind
- Befehle (bei Adresse 0, 1, 3, 5, 7)
- Adressen (bei Adresse 2, 6, 8)
- Daten (Konstante bei Adresse 4, Variable bei Adresse 9)
Die Zahlen in den Speicherzellen kann man nicht unterscheiden; ihre Bedeutung wird erst
durch die Interpretation durch den Programmablauf bestimmt.
Bevor Sie weiter machen, lesen Sie bitte den Abschnitt Tutor02.
-3-
µRISCy Tutor02: Basis-Zyklen beim Ablauf des Programms
Stellen Sie die Parameter (Menü Optionen) wie im Programm vorgeschrieben ein und
klicken auf den Steuerknopf "Einzelschritt: Zyklus". Sie hören ein "tic" und ein "tac". Das
sind die beiden Phasen eines Zyklus, eines Basis-Taktes im Innersten des Computers. Sie
kennen aus der Werbung die Takt-Frequenzen, welche je nach Geldbeutel heute (1998)
bei 100 bis 500 MHz liegen (500'000'000 Zyklen pro Sekunde)
In der tic-Phase werden die Datenpfade durchgeschaltet (die kleinen Dreiecke sind die
Treiber), also die richtige Datenquelle und die ALU-Funktion gewählt. Die elektrischen
Signale werden durch dunkelrote Einfärbung dargestellt. Alle Pfade sind 8 Bit ( = 1 Byte)
breit.
Mit dem "tac" werden die Zielregister mit den anliegenden Daten geladen. Meistens ist es
nur ein Register. Der logische Datenweg wird jetzt durch rote Einfärbung des Datenweges
angezeigt. Alle Register und Speicherplätze sind 8 Bit ( = 1 Byte) breit.
Im Kasten "Ablauf" wird diese Operation ebenfalls angezeigt. AR <- PC liest sich "das
Adressregister AR wird mit dem Inhalt des Programmcounters PC geladen". A <- A+MB
bedeutet "Akkumulator A wird mit der Summe von A und dem Memorybuffer MB geladen".
Im Kasten "Ablauf" wird auch angezeigt, zu welchem Basis-Schritt dieser Zyklus gehört.
Jede Instruktion wird – allgemein gesprochen – aufgeteilt in "Fetch Instruction" (Befehl aus
dem Speicher holen, im Instruction Register IR speichern und dekodieren) und "Execute"
(Befehl ausführen). Je nach Befehl und nach Adressier-Art des Operanden muss der
Execute-Schritt noch weiter aufgelöst werden. µRISCy kennt im kompliziertesten Fall die
Zyklen:
Fetch Instruction Befehl aus dem Speicher holen
Get Address (of Address) Adresse für indirekte Adressierung holen
Get Address (of Data) Adresse für direkte Adressierung holen
Get Data Daten holen
Execute Rechnen gemäss ALU-Einstellung
Put Data Daten zurückschreiben
Es werden nur die vom Befehl wirklich gebrauchten Zyklen durchlaufen.
Klicken Sie sich mit "Einzelschritt Zyklus" durch das Programm und versuchen Sie, jeden
Schritt nachzuvollziehen. Beobachten Sie: Datenpfad, Dekodierung, Ablauf, ALU-
Einstellung. Der angewählte Speicherplatz wird blau markiert; der Adressdecoder selber ist
nicht sichtbar.
Welche Operation läuft jeweils gleichzeitig mit einer anderen?
Als Hilfe drucken Sie die folgende Tabelle und füllen Sie aus (nur Änderungen eintragen).
[Leider fehlen in dieser Helpdatei die Tabellenränder. Benützen Sie zum Ausdrucken die
Word-Version dieses Tutorials].
-4-
TUTOR02: Einzel-Zyklen im Programm [Link]
Ablauf Daten- PC AR IR MB A ALU
Transfer
1 Fetch Instr AR <- PC 0 0 0 0 0 X <- PC
2 Fetch Instr IR <- Mem 1 13
PC <-PC+1 X <- PC+1
3 Execute
4 Fetch Instr AR <- PC 1 X <- PC
5 Fetch Instr IR <- Mem 2 17 0 0
PC <-PC+1 X <- PC+1
6 Get Adr AR <- PC 2 X <- PC
7 MB <- Mem 9
8 AR <- MB 9 X <- MB
9 Get Data MB <- Mem 3 20
PC <- PC+1 X <- PC+1
10 Execute A <- MB 20 X <- MB
11 Fetch Instr AR <- PC 3 X <- PC
12 IR <- Mem 4 96
PC <-PC+1 X <- PC+1
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
-5-
µRISCy Tutor03: Einzelschritte / Programmlogik
Lassen Sie das gleiche Programm [Link] etwas schneller laufen (mittlere
Einstellung) und klicken auf den Steuer-Knopf "Einzelschritt: Instruktion".
Wie viel aufs Mal macht jetzt µRISCy?
Beobachten Sie den Zustand des Rechners nach jeder Instruktion. Achten Sie vor allem
auf die Variable "Zähler" und auf das N-Bit im Condition Code CC. Das N-Bit zeigt an, dass
der gerechnete Wert negativ ist, was Sie am ALU-Ausgang und im Speicher ("Zähler")
sehen können. Die Art der Zahlendarstellung im Accu A kann gewählt werden.
Mit 8 Bit kann man 256 Werte darstellen. Ohne Vorzeichen sind das die Werte 0 bis 255
(als Zahlen, ASCII-Zeichen oder Speicheradressen gebraucht). Mit Vorzeichen geht der
Bereich von -128 bis +127. Diese Interpretation wird nur zum Rechnen gebraucht (Integer,
ganze Zahlen mit Vorzeichen). Beachten Sie: mit oder ohne Vorzeichen ist ausschliesslich
eine Frage der Interpretation!
[Leider fehlen in dieser Helpdatei die Tabellenränder. Schauen Sie die folgende Tabelle in
der Word-Version dieses Tutorials an].
Interpretation Interpretation CC: C CC: N CC: Z
ohne mit ALU-Resultat ALU-Resultat ALU-Resultat
Vorzeichen Vorzeichen erzeugt ist ist
binär "Cardinal" "Integer" Carry Negativ Zero (null)
0000 0001 1 1 1 0 0
0000 0000 0 0 1 0 1
1111 1111 255 -1 0 1 0
1000 0000 128 -128 0 1 0
0111 1111 127 +127 0 0 0
0000 0001 1 +1 0 0 0
0000 0000 0 0 0 0 1
1111 1111 255 -1 1 1 0
1000 0000 128 -128 1 1 0
Beachten Sie: Das Bit Nr. 7 der Daten (ganz links, MSB = most significant bit) entspricht
dem Vorzeichenbit N; das (nicht gespeicherte) Bit Nr 8 ist beim Rechnen das Carry-Bit C
(Übertrag) bei vorzeichenloser Interpretation. – Die Bits im Byte sind von 0 bis 7 numeriert,
wobei das Bit Nr. 0 das tiefstwertige Bit (ganz rechts, LSB = least significant bit) ist.
Damit der Zähler sich schneller ändert, addieren Sie #85 statt #5.
Setzen Sie "speed fast". Nicht speichern!
Auch für diese Übung ist eine Tabelle hilfreich:
-6-
TUTOR03: Einzel-Instruktionen im Programm [Link]
Adresse des Instruktion PC A CC: N Zähler
Befehls
1 0 speed 1 0 0
2 1 lda Zähler 3 20 0 20
3 3 add #85 5 105 0
4 5
5 7
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-7-
µRISCy Tutor04: Condition-Code Bits C, N, Z; Branch-Befehle
Mit dem Programm [Link] können Sie noch intensiver das Verhalten der Condition-
Code-Bits C, N und Z verfolgen. In die Tabelle tragen Sie nur noch das Resultat nach den
"sub"-Befehlen ein.
Beachten Sie: C ist das (sonst nicht gespeicherte) Bit Nr. 8 des ALU-Resultates bei
arithmetischen Operationen (add, sub, cmp); N ist das Bit Nr. 7, welches ja das Vorzeichen
darstellt (vgl. Tabelle in Tutor03).
Mit den Branch-Befehlen (bedingte Verzweigung) beq, bne, ... (siehe Beschreibung der
Befehle) werden die Condition-Code-Bits ausgewertet: Wenn die Bedingung erfüllt ist,
springt das Programm an die angegebene Adresse, sonst wird der nachfolgende Befehl
ausgeführt. Wenn Sie diesen Mechanismus ohne grosses Programm prüfen wollen,
setzten oder löschen Sie die Condition-Code-Bits mit den setx-Befehlen (siehe
Beschreibung der Befehle) und zeigen das Resultat mit soundx an.
TUTOR04: Einzel-Instruktionen im Programm [Link]
CC: C CC: N CC: Z Akku ohne Akku mit
Carry Negatif Zero Vorzeichen Vorzeichen
1
10
11
12
13
14
15
Viele Rechner kennen zusätzlich ein Overflow-Bit (V-Bit), welches die Zahlenbereichs-
überschreitung bei vorzeichenbehafteter Interpretation anzeigt. Es wird gesetzt, wenn eine
arithmetische Operation einen illegalen Vorzeichenwechsel bewirkt (positive Zahl plus
positive Zahl ergibt negatives Resultat und umgekehrt)
-8-
µRISCy Tutor05: Aufgabe "Count Down"
Nun können Sie selber ein kleines Programm schreiben: Lassen Sie in einer Count-Down-
Schleife vier Mal den sound7 ertönen und geben den Abschluss des Programms mit dem
sound5 an. Zählen Sie genau mit! Wenn Sie drei oder fünf bekommen, sind Sie eins
daneben. Das ist einer der häufigsten Programmierfehler! (Randwertproblem: erstes und
letztes Element auch richtig behandeln)
Vergleichen Sie Ihre Lösung mit [Link]
-9-
µRISCy Tutor06: Zeiger, indirekte Adressierung
Das Beispiel [Link] zeigt, wie man mit Adressen rechnen kann. Die Variable
"Zeiger" enthält eine Adresse, die auf den Operanden zeigt. Lassen Sie das Programm mit
Einzel-Instruktionen laufen. Die Instruktion "sta (Zeiger)" gehen Sie jedesmal in Einzel-
Zyklen durch, bis Ihnen klar ist, was da geschieht.
[Link]: Ablauf der Instruktion sta (Zeiger)
Ablauf Daten- PC AR MB ALU in welchen
Transfer Speicherplatz
wird das
Resultat
geschrieben?
1 Fetch Instr
9
10
11
12
13
14
15
16
17
18
19
20
21
- 10 -
µRISCy Tutor07: Peripherie-Ports; Aufgabe: "ASCII-Code"
Die Peripherie-Register (Seriell-Port, Parallel-Port, Disk-Controller, ...) werden mit den
Befehlen IN und OUT angesprochen. Die Daten und Adressen brauchen die gleichen
Drähte auf dem System-Bus, wie ein Memory-Zugriff. Auf dem Control-Bus wird aber "I/O"
statt "Mem" signalisiert. µRISCy kann 256 Port-Adressen ansprechen (genau gleich wie
Memory); aber es sind nur zwei I/O-Register wirklich vorhanden:
IN 34liest das Eingabe-Byte. Sie können sich hier die Serielle Schnittstelle
einer Tastatur vorstellen. Eingabe im Textfeld oder Einzelbits durch
Anklicken. So lernen Sie grad auch noch die Darstellung der Buchstaben
im ASCII-Code kennen.
OUT 79schreibt auf das Ausgabe-Byte. Sie können sich hier die Parallele
Schnittstelle eines Druckers vorstellen. Die Darstellung ist binär und als
ASCII-Zeichen.
Aufgabe:
Ihr Programm soll immer, wenn ein neues Zeichen im Eingabe-Register steht (und nur
dann), den sound5 abspielen und das Zeichen am Ausgabe-Port anzeigen.
Vergleichen Sie Ihre Lösung mit [Link].
- 11 -
µRISCy Tutor08: Aufgabe "Tabelle kopieren" (Zeiger)
Sie haben in Tutor06 die indirekte Adressierung mittels Zeiger kennengelernt. Solche
Zeiger (Pointer) werden häufig beim Kopieren von ganzen Speicherbereichen (z.B.
Tabellen) gebraucht. Versuchen Sie, die Tabelle bei T1 mit 5 Werten in die Tabelle T2 zu
kopieren. Als Hilfe steht Ihnen der Anfang des Programms und die Tabellen unter dem
Namen [Link] zur Verfügung. [Link] laden Sie erst, wenn Ihre Lösung
läuft!
[Leider fehlen in dieser Helpdatei die Tabellenränder. Schauen Sie die folgende Skizze in
der Word-Version dieses Tutorials an].
Z1 T1 Z1 T2
T1 ======> 83 T2 ======>
117
112
101
114
Malen Sie, auch beim Programmieren mit höheren Programmiersprachen, die Zeiger als
Pfeil auf. Jeder Pfeil heisst "1 x indirekt" und kann direkt mit dem sprachspezifischen
"Pointer-Zeichen" programmiert werden.
- 12 -
µRISCy Tutor09, Tutor10, Tutor11: Logik-Befehle
Mit den drei Programmen [Link], [Link] und [Link] lernen Sie, wie die
Logischen Operationen AND, OR und XOR funktionieren. Damit Sie eine bitweise
Darstellung der Werte haben und diese auch während des Ablaufs verändern können,
arbeiten die Programme mit den IN- und OUT-Registern. Nur die Maske (2. Operand der
Logik-Oeration) ist im Programm als Konstante und kann natürlich ebenfalls verändert
werden.
A B AND A B OR A B XOR
0 0 0 0 0 0
0 1 0 1 0 1
1 0 1 0 1 0
1 1 1 1 1 1
- 13 -
µRISCy Tutor12: Aufgabe "Änderung feststellen"
XOR (exclusive OR) ist eine sehr mächtige Instruktion. Im Bereich Prozessrechner ist vor
allem interessant, dass man mit XOR Veränderungen von Einzelbits (z. B. Endschalter,
Tasten, ...) feststellen kann.
Aufgabe: Zeigen Sie im OUT-Register an, welche Bits im IN-Register (durch Anklicken)
verändert wurden. Achtung: die Anzeige soll bis zur nächsten Änderung bleiben.
Die Lösung finden Sie unter [Link]
- 14 -
µRISCy Tutor13: C-Bit = Übertrag
Das C-Bit im Condition-Code (Carry-Bit) wird in realen Rechnern für alles Mögliche
gebraucht. Da der µRISCy aber keine Shift- und Rotate-Befehle kennt, ist das C-Bit nur bei
arithmetischen Operationen (add, sub, cmp) interessant und wird von den anderen
Befehlen nicht beeinflusst (ausser natürlich setc und clrc).
Die Funktion des Carry-Bits wird am Beispiel [Link] anhand der Addition gezeigt.
Sobald beim Aufsummieren die Darstellungsgrenze eines Bytes (255) überschritten wird,
wird das durch das Carry-Bit angezeigt. Die arithmetischen Operationen betrachten die
Werte ohne Vorzeichen, damit man Doppel-Byte-Integer programmieren kann. Das Carry-
Bit ist dann nichts anderes als das (sonst nicht gespeicherte) Bit Nr. 8 des ALU-Resultates,
also der Übertrag (Carry) auf das höherwertige Byte. Das ist das "Behalte", welches Sie in
der Primarschule gelernt haben.
Beobachten Sie das Verhalten des Programms und versuchen es mit Hilfe des
Kommentars zu verstehen. Mit dem sound2 wird übrigens das Carry-Bit "angetönt".
- 15 -
µRISCy Tutor14: Doppel-Byte Addition B <- A + B
[Link] zeigt eine voll ausprogrammierte Doppel-Byte-Addition.
Berechnung der Werte:
(High-Byte * 256) + Low-Byte
[Tip: zum Nachrechnen benützen Sie das Windows-Zubehör "Calculator"]
High-Byte Low-Byte Wert
A 7 65 1857
B 3 229 997
+
Resultat B 11 38 2854
High-Byte Low-Byte Wert
A
B
+
Resultat B
High-Byte Low-Byte Wert
A
B
+
Resultat B
High-Byte Low-Byte Wert
A
B
+
Resultat B
High-Byte Low-Byte Wert
A
B
+
Resultat B
High-Byte Low-Byte Wert
A
B
+
Resultat B
- 16 -
µRISCy Tutor15: Konversion binär ==> ASCII
Zahlenwerte sind im Computer binär gespeichert. Sie kennen unterdessen die
Interpretation "Integer" (Ganzzahl -128 ... +127) und "unsigned" (vorzeichenlos 0 ... 255)
Um diese Zahlen auf dem Bildschirm oder auch auf einem Ausdruck sichtbar zu machen,
muss man die einzelnen Ziffern im ASCII-Code ausgeben. Man muss also die binäre
Darstellung in eine Zeichenkette (String) umwandeln (konvertieren).
[Link] macht das für einen Integer. Die Formatanweisung "%i" in C-Programmen
macht im wesentlichen genau das.
Versuchen Sie, das Programm zu verstehen. Geben Sie bei der Variable "Wert" andere
Werte ein und lassen das Programm nochmal laufen.
Wahrscheinlich fällt Ihnen auf, dass solche Umformatierungen recht aufwendig sind. Das
ist bei Fliesskommazahlen erst recht so!
- 17 -
µRISCy Tutor16: selbstmodifizierendes Programm
Selbstmodifizierende Programme waren in der Anfangszeit der Computerei üblich und –
aus Speicherplatzgründen – oft nötig. Heute sind sie nicht nur verpönt, sondern meist gar
nicht mehr möglich, weil die Programme und Daten in verschiedenen Speicherbereichen
abgelegt werden. (Stichwörter ohne Erklärung: Memory-Management, ROM, Reentrancy)
Das Beispiel modifiziert den sound9-Befehl (code 9) durch Runterzählen schrittweise bis
sound1 (code 1) und dann STOP (code 0) und zeigt damit spielerisch, dass der Speicher-
inhalt je nach Interpretation
- ein Befehl (sound, stop, ..)
- eine Adresse (Verweis auf S bei Adresse 2, 6 und 8)
- ein Wert (nochmal S, das beim Abzählen als Variable behandelt wird)
sein kann.
- 18 -
µRISCy Tutor17: Selber Computer spielen
RISC steht ja für "Reduced InstructionSet Computer", also "Computer mit einem
reduzierten Befehlssatz". Sogar die sehr einfache Architektur von µRISCy würde mehr
erlauben, als im Modell simuliert wird. Versuchen Sie, selber neue Befehle oder
Adressierarten zu erfinden und von Hand (Menü Simulator/Handbetrieb) wenigstens
fragmentarisch durchzuspielen. Wählen Sie den Datenpfad beim Treiber (kleine Dreiecke)
und übernehmen die Daten in alle möglichen Register oder in den Speicher (auch da
reinklicken). Sie werden bald merken, wo man was für Zusatzregister einbauen müsste.
Einige Tips:
- Clear-Befehl (A <- 0)
- Increment-Befehl (A <- A + 1)
- PC in eine Variable speichern (Mem <- PC)
- Branch mit Offset statt Zieladresse (PC <- PC + MB)
- indirekte Adressierung mit Akkumulator als Adresse (AR <- A)
- Indexierte Adressierung (AR <- A + MB)
- Indexierte Adressierung (AR <- X + MB, mit X=Indexregister (wo einbauen?))
- Positionsunabhängige Adressierung (AR <- PC + MB)
-
-
Was passiert, wenn Sie ein "INCrement Mem" oder "DECremet Mem" realisieren wollen?
Was für Datenpfade und Register müsste man wo einbauen, um mehr Parallelität
(gleichzeitig ausgeführte Schritte wie z.B. PC <- PC + 1) zu erreichen?
- 19 -
µRISCy Tutor18: µRISCy versus Pentium, PowerPC, Sparc, Alpha, Mips, ...
Mit dem µRISCy, also dem "Micro Reduced InstructionSet Computer" kann man überraschend viele
Probleme lösen. Wenn auch nicht gerade berauschend schnell. Mit wenig Ergänzungen und einer sehr hohen
Taktrate könnte man ohne weiteres einen brauchbaren Computer aufbauen. Was unterscheidet nun µRISCy
von den heute gängigen Rechnern? Grundsätzlich eigentlich wenig, ausser dass mit zusätzlichen Registern,
Datenpfaden und Befehlen versucht wird, mit der aktuellen Hardware-Technik ein möglichst schnelles
System aufzubauen. Es folgt eine Liste von Begriffen, die Sie vielleicht schon mal gehört haben. Schreiben
Sie Erklärungen dazu, wenn immer Sie etwas Neues kennengelernt haben!
8 - 16 - 32 - 64 - 128 bit Daten grössere Zahlenbereiche,
mehr Befehle, komlexere Befehle
8 - 16 - 32 - 64 - 128 bit Adressen grössere Speicher (µRISCy hat nur 256 Bytes)
V-Bit im Condition Code Overflow-Detection
indexierte Adressierung, Autoincrement, flexiblere (optimalere) Programmierung
Autodecrement
Multi-Register statt Akkumulator sehr schnelle, lokale Speicher für Daten und Adressen
Stack und Stack-Befehle für Subroutinen und Interrupt
separate Adress-Rechenwerke überlappende Adressrechnungen
Shift-, Rotate-Befehle * 2, /2, Bitoperationen
Multioperand-Befehle B <- A op B, C <- A op B
Multiplikation, Division schneller rechnen
Floatingpoint-Arithmetik schneller rechnen
BCD-Arithmetic für Buchhaltungsprogramme
Interrupt, Trap optimale Peripherie-Bedienung, Fehlerbehandlung,
Verbindung zu Betriebssystem
Direct Memory Access DMA Datentransfer von/zu Peripherie ohne CPU
Instruction Prefetch Befehle auf Vorrat holen
Pipeline überlappende Zyklen
mehrere Rechenwerke mit gleichen oder verschiedenen Fähigkeiten
Memory Management Protection, User/Kernel, Paging, virtual Memory, ...
Cache zur Geschwindigkeitsanpassung CPU - Memory
Instruction-/Dataspace Getrennte Speicherbereiche für Programm und Daten
(Harvard Architektur)
ROM / RAM Betriebssystem(teile) im "Read only Memory" ( Mac Toolbox,
BIOS, Boot-Roms, controllerspezifische Treiber, ...)
Videocontroller, Graphik-Prozessor mit 3-D-Unterstützung u.v.m.
Sound, Multimedia-Support wer kennt das nicht
Multi-CPU-Systeme bis 4096! speziell für Simulationsrechnungen (Wetter,
Chemie, ..)
Peripherie-Rechner z.B. für Kommunikationsaufgaben, Disk/Tape/Roboter-
Subsysteme, ...
Programmierbare Micro-Programmierung mit der gleichen Hardware verschiedene Rechnertypen oder
neue Instruktionen implementieren
Es gibt allerdings auch Computer, die mehr oder weniger grundsätzlich anders aufgebaut oder extrem an ein
Spezial-Problem angepasst sind. Nur Stichworte:
• Data-Flow-Computer
• Transputer
• Vector-Rechner
• Fuzzy-Rechner
• Assoziativ-Speicher
• Geräte-Controller
- 20 -
µRISCy Tutor19: höhere Programmiersprachen
Was macht C, C++, Pascal, Modula, Oberon, FORTRAN, COBOL, ADA, PORTAL,
DELPHI, JAVA, Basic und alle anderen sogenannt "höheren Programmiersprachen" mit
den Programmen?
Im Prinzip übersetzen alle Compiler die Programme in einem oder in mehreren Schritten in
Maschinensprache, also in Befehle, wie Sie sie im µRISCy kennengelernt haben. Bei
genauerer Betrachtung gibt es allerdings feine Unterschiede beim erzeugten Code:
• echte Maschinensprache (Native Code; C, Pascal)
• Kette von Prozedur-Aufrufen (threaded Code; gewisse FORTRAN-Compiler)
• Meta-Code, der von einem Runtime-System interpretiert wird (Basic, Java)
- 21 -
µRISCy Tutor20: Üben solang's Spass macht
Schreiben Sie Ihre eigenen µRISCy-Beispiele. Besonders gut gelungene Werke, ev. mit
TUTOR-ähnlicher Beschreibung schicken Sie bitte dem Autor. Herzlichen Dank.
Ideen:
• Light-Show auf OUT-Register ([Link], [Link])
Franz Kuster
ETH Computer-Service
8092 Zürich
Kuster@[Link]
30. Juli 1997
22. Januar 1998
- 22 -