Übersicht der µRISCy Befehle
µRISCy Befehle

	Befehlsstruktur
lda	Lädt Wert in den Akku
sta	Speichert Wert in Speicherzelle
and	AND-Verknüpfung Akku mit Wert
or	OR-Verknüpfung Akku mit Wert
xor	XOR-Verknüpfung Akku mit Wert
add	Addiert Wert zu Akku, Resultat im Akku
sub	Subtrahiert Wert von Akku, Resultat im Akku
cmp	Subtrahiert Wert von Akku
jmp	Sprung zu Adresse
beq	Bedingter Sprung, abhängig vom  Zero-Flag
bne
bns	Bedingter Sprung, abhängig vom  Negative-Flag
bnc
bcs	Bedingter Sprung, abhängig vom  Carry-Flag
bcc
setc, clrc	Condtition-Code-Flags setzen, löschen
setn, clrn
setz, clrz
soundx	Spielt die Datei soundx.wav, x = 1 ... 9
in	Liest Eingaberegister
out	Schreibt auf Ausgaberegister
stop	Stoppt die Ausführung
speed	Stellt die Simulationsparameter ein


Befehlsstruktur und Adressierungarten
Befehlsstruktur und Adressierarten

µRISCy Befehlsstruktur

7	6	5	4	3	2	1	0
Op-Code (Befehl)	je nach Befehl	Adressierart
stop 0	0
sound 0	1 ... 9
(frei) 0	10 ... 12
speed 0	13 ... 15
lda 1	nicht gebraucht	#M M (M)
sta 2	nicht gebraucht	M (M)
and 3	nicht gebraucht	#M M (M)
or 4	nicht gebraucht	#M M (M)
xor 5	nicht gebraucht	#M M (M)
add 6	nicht gebraucht	#M M (M)
sub 7	nicht gebraucht	#M M (M)
cmp 8	nicht gebraucht	#M M (M)
jmp 9	0	M (M)
beq 9	1	M (M)
bmi 9	2	M (M)
bcs 9	3	M (M)
beq 10	1	M (M)
bmi 10	2	M (M)
bcs 10	3	M (M)
clrz 11	0	1
clrn 11	0	2
clrc 11	0	4
setz 11	1	1
setn 11	1	2
setc 11	1	4
in 12	nicht gebraucht	P (M)
out 13	nicht gebraucht	P (M)
(frei) 14
(frei) 15

µRISCy Adressierarten

Code	Adressierart	Beschreibung (siehe auch Tutorial)
0	#Mem	immediate, "Konstante" M ist die Konstante und ist unmittelbar hinter dem Befehl gespeichert
1	Mem	Memory direct, "Variable" M ist die Adresse des Datenbytes
2	(Mem)	Memory indirect, "Zeiger" M zeigt auf die Adresse des Datenbytes


System-Calls
"System-Calls"

Code	Mnemonic	Beschreibung (siehe auch Tutorial)
0	stop	Stop Die Ausführung des Programmes hält an. Diesen Maschinenbefehl gibt es bei den meisten Computern. Anwenderprogramme kann man aber nicht anhalten. Man verlässt sie mit einem "Exit to System". Man kann deshalb den Stop-Befehl auch als Rücksprung in das µRISCy-Betriebssystem verstehen. Der Condition-Code bleibt unverändert.
1 ... 9	sound1 ... sound9	Sound1 .. Sound9 Die Sound-Befehle sind keine eigentlichen Maschinen-Befehle, sondern rufen das µRISCy-Betriebssystem auf und lassen dieses die Sound-Datei SOUNDx.WAV spielen. Der Condition-Code bleibt unverändert.
13 14 15	speed slow speed medium speed fast	speed slow langsame Ausführung speed medium mittelschnelle Ausführung speed fast schnelle Ausführung Die speed-Befehle sind keine eigentlichen Maschinen-Befehle, sondern rufen das µRISCy-Betriebssystem auf und setzen die Simulationsgeschwindigkeit.  Der Rechnertakt wird auch in Laptops umgeschaltet, um zwischen maximaler Leistung und minimalem Stromverbrauch zu wählen. Der Condition-Code bleibt unverändert.
		alle nicht definierten Codes gelten als "Illegal Instruction" und bewirken "Stop"


Transfer-Befehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
16 17 18 oder $10 $11 $12 allg. $1x $ steht für hexadezimal x steht für die Adressierart	lda	#Mem Mem (Mem)	Load Accumulator A <-- Mem Lädt den adressierten Wert aus dem Arbeitsspeicher (Memory, RAM) in den Akkumulator. Das ist, zusammen mit dem sta-Befehl, der wohl wichstigste Befehl für einen "Akku-Rechner", wie ihn der µRISCy darstellt. Da der Akkumulator für jede Berechnung gebraucht wird, kann man kaum Zwischenresultate dort speichern; man muss (fast) immer mit Variablen im Speicher arbeiten. Man spricht deshalb bei µRISCy-ähnlichen Rechnern von "Load and Store-Architektur". Condition-Code: N und Z werden dem Datenbyte entsprechend gesetzt: N für negativ, Z für null (zero); C bleibt unverändert. Bsp: lda Zähler lda #15 lda (Zeiger)
33 34 oder $21 $22 allg. $2x $ steht für hexadezimal x steht für die Adressierart	sta	Mem (Mem)	Store Accumulator Mem <-- A Der Inhalt des Akkumulators wird im Speicher abgelegt. Der Condition-Code bleibt unverändert. Bsp: sta Zähler sta (Zeiger)


Logik-Befehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
48 49 50	and	#Mem Mem (Mem)	AND Accumulator A <-- A AND Mem Die beiden Operanden werden bitweise mit AND (UND) verknüpft. (siehe Tutorial) Condition-Code: N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero); C bleibt unverändert. Bsp: and Maske and #37 and (Pointer)
64 65 66	or	#Mem Mem (Mem)	OR Accumulator A <-- A OR Mem Die beiden Operanden werden bitweise mit OR (ODER) verknüpft. (siehe Tutorial) Condition-Code: N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero); C bleibt unverändert. Bsp: or Maske or #128 or (vonort)
80 81 82	xor	#Mem Mem (Mem)	XOR Accumulator A <-- A XOR Mem Die beiden Operanden werden bitweise mit XOR (Exklusive-ODER) verknüpft. (siehe Tutorial) Condition-Code: N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero); C bleibt unverändert. Bsp: xor Maske xor #255 xor (Adr)


Arithmetische Befehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
96 97 98	add	#Mem Mem (Mem)	Add to Accumulator A <-- A + Mem Der Wert aus dem Speicher wird zum Akkumulator addiert (dazugezählt). Condition-Code: C, N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero), C für Übertrag (carry) Bsp: add Wert add #89 add (Ref)
112 113 114	sub	#Mem Mem (Mem)	Subtract from Accumulator A <-- A - Mem Der Wert aus dem Speicher wird vom Akkumulator subtrahiert (abgezählt). Condition-Code: C, N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero), C für Übertrag (carry) Bsp: sub Value sub #24 sub (TabPoint)
128 129 130	cmp	#Mem Mem (Mem)	Compare with Accumulator A - Mem Der Wert aus dem Speicher wird mit dem Inhalt des Akkumulators verglichen, indem die Differenz gerechnet wird (wie sub). Das Resultat wird aber nicht in den Akkumulator geschrieben; lediglich die Condition-Code-Bits werden geladen. Condition-Code: C, N und Z werden dem Resultat entsprechend gesetzt: N für negativ, Z für null (zero), C für Übertrag (carry) Bsp: cmp Referenz cmp #100 cmp (there)


Sprungbefehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
145 146	jmp	Mem (Mem)	Jump PC <-- Adr(Mem) Unbedingter Sprung an die Sprungmarke. Der CC wird nicht verändert. Bsp: jmp Sprungmarke jmp (Sprungzeiger)
149 150	beq	Mem (Mem)	Branch if Equal Zero Springe (verzweige) zur angegebenen Adresse, wenn der Condition Code CC "gleich Null" anzeigt (Z=1), wenn also das Resultat der letzten Instruktion gleich Null war. Sonst: Befehl direkt nach beq ausführen. Der CC wird nicht verändert. Bsp.: beq Sprungmarke
153 154	bns oder bmi	Mem (Mem)	Branch if Negatif Set oder Branch if Minus Springe (verzweige) zur angegebenen Adresse, wenn der Condition Code CC "negativ" anzeigt (N=1), wenn also das Resultat der letzten Instruktion negativ war. Sonst: Befehl direkt nach bns ausführen. Der CC wird nicht verändert. Bsp.: bns label
157 158	bcs oder blo	Mem (Mem)	Branch if Carry Set oder Branch if Lower Springe (verzweige) zur angegebenen Adresse, wenn das C-Bit im Condition Code gesetzt ist (C=1), wenn also das Resultat der letzten arithmetischen Instruktion einen Übertrag erzeugt hat. Sonst: Befehl direkt nach bcs ausführen. blo liest sich nach einem cmp-Befehl aussagekräftiger, wenn das Argument des cmp-Befehls die Vergleichsreferenz ist. Der CC wird nicht verändert. Bsp.: bcs again
165 166	bne	Mem (Mem)	Branch if Not Equal Zero Springe (verzweige) zur angegebenen Adresse, wenn der Condition Code CC "ungleich Null" anzeigt (Z=0), wenn also das Resultat der letzten Instruktion ungleich Null war. Sonst: Befehl direkt nach bne ausführen. Der CC wird nicht verändert. Bsp.: bne loop
169 170	bnc oder bpl	Mem (Mem)	Branch if Negatif Clear oder Branch if Plus Springe (verzweige) zur angegebenen Adresse, wenn der Condition Code CC "nicht negativ" anzeigt (N=0), wenn also das Resultat der letzten Instruktion positiv war. Sonst: Befehl direkt nach bnc ausführen. Der CC wird nicht verändert. Bsp.: bnc next
173 174	bcc oder bhs	Mem (Mem)	Branch if Carry clear oder Branch if higher or same Springe (verzweige) zur angegebenen Adresse, wenn das C-Bit im Condition Code nicht gesetzt ist (C=0), wenn also das Resultat der letzten arithmetischen Instruktion keinen Übertrag erzeugt hat. Sonst: Befehl direkt nach bcc ausführen. bhs liest sich nach einem cmp-Befehl aussagekräftiger, wenn das Argument des cmp-Befehls die Vergleichsreferenz ist. Der CC wird nicht verändert. Bsp.: bcc fertig


Condition-Code-Befehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
177	clrz		Clear Z Z <-- 0 Löscht das Z-Bit im Condition-Code
178	clrn		Clear N N <-- 0 Löscht das N-Bit im Condition-Code
180	clrc		Clear C C <-- 0 Löscht das C-Bit im Condition-Code
185	setz		Set Z Z <-- 1 Setzt das Z-Bit im Condition-Code
186	setn		Set N N <-- 1 Setzt das N-Bit im Condition-Code
188	setc		Set C C <-- 1 Setzt das C-Bit im Condition-Code


Ein-/Ausgabe-Befehle

Code	Mnemonic	Adressierart	Beschreibung (siehe auch Tutorial)
193 194	in	Port (Mem)	Input A <-- Port Liest das Eingaberegister auf Port-Adresse P in den Akkumulator. Bei indirekter Adressierung wird die Port-Adresse P aus der Arbeitsspeicherzelle Mem geholt. Condition-Code: N und Z werden dem Datenbyte entsprechend gesetzt: N für negativ, Z für null (zero); C bleibt unverändert. Bsp.: in 34 "Tastatur-Eingabe" µRISCy hat nur ein einziges Eingaberegister auf Port-Adresse 34. Lesen von anderen Ports kann undefinierte Daten liefern.
209 210	out	Port (Mem)	Output Port <-- A Schreibt den Akkumulator-Inhalt auf das Ausgaberegister bei Port-Adresse P Bei indirekter Adressierung wird die Port-Adresse P aus der Arbeitsspeicherzelle M geholt. Der Condition-Code bleibt unverändert. Bsp.: out 79 "Drucker-Ausgabe" µRISCy hat nur ein einziges Ausgaberegister auf Port-Adresse 79. Schreiben auf andere Ports geht "ins Leere".


µRISCy	Inhalt

µRISCy
ein didaktisches Rechnermodell

auf Stufe "Datenpfad und Register"

µRISCy-Projekt

µRISCy-Installation

µRISCy-Assembler

µRISCy-Simulator

µRISCy-Befehlssatz

µRISCy-Tutorial

Im Sekundentakt (oder von Hand gesteuert) erleben Sie, was heutige Rechner mit 500 MHz abarbeiten. Ein 20ig-teiliges Tutorial führt Sie mit kleinsten Assemblerbeispielen und -übungen durch die wichtigsten Mechanismen eines klassischen Neumann-Rechners.

µRISCy simuliert einen voll funktionsfähigen 8bit Acu-Rechner mit 256 Byte RAM und je einem Ein- und Ausgabe-Register ("Tastatur" und "Drucker"). Er kennt 20 leichtverständliche Befehle und macht mit Farbe und Sound auch noch ein bisschen Spass.

µRISCy läuft unter Windows mit SVGA und Sound.


µRISCy Projekt

Das µRISCy-Programm ist das Resultat einer Semesterarbeit SS97

bei Franz Kuster, Computer Service, ETH Zürich

von Christoph Schuler (IIIC)

Der Datenpfad stammt von einer früheren Idee von Herrn Kuster. Die Arbeit brachte diese vom Papier auf den Bildschirm. Die Simulation soll ein didaktisches Optimum zwischen Überschaubarkeit und Komplexität sein.

Uns sind im Laufe der Entwicklung viele zusätzlich Ideen gekommen, mussten dann aber viele verwerfen, da sie  ausser Komplexität nichts neues einbringen würden.

Der µRISCy soll überschaubar bleiben und in relativ kurzer Zeit zu verstehen sein.


µRISCy Installation

Die Installation von µRISCy ist denkbar einfach: Das ganze Verzeichnis (uRISCy16 oder uRISCy32) auf die Harddisk kopieren.

Starten: uRISCy.exe

Für Fortgeschrittene:

Es kann auch die Erweiterung .raf mit uRISCy.exe verknüpft werden.

(z.B. WinNT,Win95: Explorer, Ansicht, Optionen, DateiTypen ..

oder Öffnen mit ... )


µRISCy Tutorial

Siehe auch

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 (TUTORxx.RAF) 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 Winword DOC-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 (LOESGxx.RAF) erst, wenn Ihr eigenes Programm läuft (oder wenn Sie gar nicht weiter kommen).


µRISCy Tutor00: Erstes Erfolgserlebnis

Siehe auch

Laden (öffnen) Sie im Editor des µRISCy das Programm ALLSOUND.RAF 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 SOUNDx.WAV 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.


µRISCy Tutor01: Programm übersetzen und laden

Siehe auch

Laden Sie das Programm TUTOR01.RAF, 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.


µRISCy Tutor02: Basis-Zyklen beim Ablauf des Programms

Siehe auch

Stellen Sie die Parameter (Menü Einstellungen) 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-Schrittes im Innersten des Computers. Sie kennen aus der Werbung die Takt-Frequenzen, welche je nach Geldbeutel heute (1997) bei 100 bis 500 MHz liegen (500'000'000 Zyklen pro Sekunde)

In der tic-Phase werden die Datenpfade durchgeschaltet, 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 "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	für indirekte Adressierung

Get Address of Data	für direkte Adressierung

Get Data	endlich die Daten holen

Execute	Rechnen gemäss ALU-Einstellung

Put Data	Daten zurückschreiben

Klicken Sie sich durch das Programm und versuchen Sie, jeden Schritt nachzuvollziehen. Beobachten Sie: Datenpfad, Dekodierung, Ablauf, ALU-Einstellung. Welche Operation läuft jeweils gleichzeitig mit einer anderen?

Als Hilfe drucken Sie die folgende Tabelle und füllen Sie aus (nur Änderungen eintragen)


µRISCy TUTOR02: Einzel-Zyklen im Programm TUTOR01.RAF

Siehe auch

Ablauf	Daten-Transfer	PC	AR	IR	MB	A	ALU

1	Fetch Instr	IR <- Mem

PC <-PC+1	1	0	17	0	0

X <- PC+1

2	Get Adr	AR <- PC	1	X <- PC

3	MB <- Mem	8

4	AR <- MB	8	X <- MB

5	Get Data	MB <- Mem

PC <- PC+1	2	20

X <- PC+1

6	Execute	A <- MB	20	X <- MB

7	Fetch Instr	AR <- PC	2	X <- PC

8	IR <- Mem

PC <-PC+1	3	96

X <- PC+1

9


µRISCy Tutor03:  Einzelschritte / Programmlogik

Siehe auch

Lassen Sie das gleiche Programm TUTOR01.RAF 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 Winword DOC-Version dieses Tutorials an].

Interpretation	Interpretation	CC: C	CC: N	CC: Z

ohne	mit	ALU-Resultat	ALU-Resultat	ALU-Resultat

Vorzeichen	Vorzeichen	erzeugt	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!


µRISCy TUTOR03: Einzel-Instruktionen im Programm TUTOR01.RAF

Siehe auch

Adresse	Instruktion	PC	A	CC: N	Zähler

1	0	speed	1	0	0

2	1	lda Zähler	3	20	0	20

3	3	add #85	5	105	0


µRISCy Tutor04: Condition-Code Bits C, N, Z; Branch-Befehle

Siehe auch

Mit dem Programm Tutor04.RAF 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 TUTOR04.RAF

Tabelle in der Winword DOC-Version.

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)


µRISCy Tutor05: Aufgabe "Count Down"

Siehe auch

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 LOESG05.RAF


µRISCy Tutor06: Zeiger, indirekte Adressierung

Siehe auch

Das Beispiel Tutor06.RAF 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.

Tutor06.RAF: Ablauf der Instruktion sta (Zeiger)

Tabelle in der Winword DOC-Version.


µRISCy Tutor07: Peripherie-Ports; Aufgabe: "ASCII-Code"

Siehe auch

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	34	liest 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	79	schreibt 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 LOESG07.RAF.


µRISCy Tutor08: Aufgabe "Tabelle kopieren" (Zeiger)

Siehe auch

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 TUTOR08.RAF zur Verfügung. LOESG08.RAF laden Sie erst, wenn Ihre Lösung läuft!

[Leider fehlen in dieser Helpdatei die Tabellenränder. Schauen Sie die folgende Skizze in der Winword DOC-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.


µRISCy Tutor09, Tutor10, Tutor11: Logik-Befehle

Siehe auch

Mit den drei Programmen Tutor09.RAF, Tutor10.RAF und Tutor11.RAF 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


µRISCy Tutor12: Aufgabe "Änderung feststellen"
µRISCy Tutor12: Aufgabe "Äenderung feststellen"

Siehe auch

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 LOESG12.RAF


µRISCy Tutor13: C-Bit = Übertrag

Siehe auch

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 Tutor13.RAF 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".


µRISCy Tutor14: Doppel-Byte Addition B <- A + B
µRISCy Tutor14: Doppel-Byte Addition B <= A + B

Siehe auch

Tutor14.RAF 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


µRISCy Tutor15: Konversion binŠr ==> ASCII
µRISCy Tutor15: Konversion binär -> ASCII

Siehe auch

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).

Tutor15.RAF 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!


µRISCy Tutor16: selbstmodifizierendes Programm

Siehe auch

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 Speicherinhalt 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.


µRISCy Tutor17: Selber Computer spielen

Siehe auch

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?


µRISCy Tutor18: µRISCy versus Pentium, PowerPC, Sparc, Alpha, Mips, ...

Siehe auch

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, Autodecrement	flexiblere (optimalere) Programmierung
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


µRISCy Tutor19: hšhere Programmiersprachen
µRISCy Tutor19: höhere Programmiersprachen

Siehe auch

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)


µRISCy Tutor20: Üben solang's Spass macht

Siehe auch

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 (Loesg20a.RAF, Loesg20b.RAF)

Franz Kuster

ETH Computer-Service

8092 Zürich

Kuster@cs.id.ethz.ch

30. Juli 1997

22. Januar 1998


µRISCy Tutorial

µRISCy Tutor00	Erstes Erfolgserlebnis

µRISCy Tutor01	Programm Übersetzen und laden

µRISCy Tutor02	Basis-Zyklen beim Ablauf des Programms

µRISCy Tutor03	Einzelschritte / Programmlogik

µRISCy Tutor04	Condition-Code Bits C, N, Z; Branch-Befehle

µRISCy Tutor05	Aufgabe "Count Down"

µRISCy Tutor06	Zeiger, indirekte Adressierung

µRISCy Tutor07	Peripherie-Ports; Aufgabe: "ASCII-Code"

µRISCy Tutor08	Aufgabe "Tabelle kopieren" (Zeiger)

µRISCy Tutor09 	Logik-Befehl AND

µRISCy Tutor10 	Logik-Befehl OR

µRISCy Tutor11	Logik-Befehl XOR

µRISCy Tutor12	Aufgabe "Änderung feststellen"

µRISCy Tutor13	C-Bit = Übertrag

µRISCy Tutor14	Doppel-Byte Addition B <- A + B

µRISCy Tutor15	Konversion binär ==> ASCII

µRISCy Tutor16	selbstmodifizierendes Programm

µRISCy Tutor17	Selber Computer spielen

µRISCy Tutor18	µRISCy versus Pentium, PowerPC, Sparc, Alpha, Mips, ...

µRISCy Tutor19	höhere Programmiersprachen

µRISCy Tutor20:	Üben solang's Spass macht

Siehe auch Winword DOC-Version


 µRISCy Simulator

Der µRISCy ist ein reiner 8-bit Rechner, sowohl die Daten als auch die Adressen.

Die Linien stehen logisch für die verbindenden Busse, und die Kästchen für die Register.

Im Simulationsbetrieb geschieht die Steuerung via den Pfeiltasten im unteren Bereich.

Im Menü kann die Funktion Handbetrieb gewählt werden, dann können alle Funktionen mit der Maus ausführt werden ( z.B. Click auf ein Register taktet dieses, Click auf einen Treiber aktiviert ihn usw.)

Bei den meisten Elementen erscheint eine Kurzhilfe, wenn man die Maus auf ihnen ruhen lässt.

Weitere Informationen findet man im Tutorial.


 µRISCy Assembler

Wie schreibe ich ein Assemblerprogramm (Syntax)

Die Steuerbefehle für den Assembler

Der Befehlssatz


Wie schreibe ich ein Assemblerprogramm

Ein Assembler-Programm besteht aus Befehlen, die jeweils auch einer separaten Zeile stehen.

Zuvorderst kann ein Label stehen, das die Adresse der jeweiligen Zeile enthält

(z.B. Variablen, Sprungmarke)

Getrennt von mindestens einem Tab oder Leerzeichen folgt dann der Maschinen-Befehl

(z.B. LDA, STA)

Danach folgt, wieder getrennt, das Argument (z.B.  #5,# $04, Label3)

Das Programm startet immer bei Adresse 0 und endet mit einem STOP-Befehl

Im Verzeichnis Tutorial findet man viele Beispiele, Beschreibungen dazu unter Tutorial


Die Steuerbefehle des Assemblers

Es sind folgende Steuerbefehle implementiert:

;	Kommentar: Alles hinter dem Semikolon wird ignoriert.

Bsp.

; Hier sieht man die Funktion des beq-Befehls

nam	Als Argument steht der Name des Programms und des Autors

Wird im Simulator unten links hingeschrieben.

Bsp.

label	nam	Test-Programm, Ch. Schuler

byte	reserviert ein Byte im Speicher und initialisiert es

Variablendefinition!

Bsp.

Zaehler	byte	0

+ -	Der Assembler kann mit Labeln rechnen,

allerdings nur plus und minus, ohne Klammern.

Die Klammern bedeuten indirekte Adressierung

und werden entsprechend übersetzt.

Bsp. (mit Label1=10)

lda  (134-Label1)	=>	lda  (124)         Indirekt !

lda   134-Label1	=>	lda  124