Ich versuche seit einigen Tagen an einer Registermaschine (mit Harvard-Technologie) eine Division durchführen zu lassen. Es funktioniert aber überhaupt nicht. Hier der entsprechende Befehlssatz:
LDA (Lädt den Akku mit dem Wert der Speicherstelle n)
LDK (Lädt den Akku mit einer bestimmten Zahl)
STA (Überträgt den Akku-Inhalt an die Speicherstelle n)
ADD (Erhöht den Akku-Inhalt um den Inhalt der Speicherstelle n)
SUB (Erniedrigt den Akku-Inhalt um den Inhalt der Speicherstelle n)
JMP (Sprungbefehl an eine bestimmte Speicherstelle (Schleife))
JEZ (Sprungbefehl nur wenn der Akku den Wert 0 hat)
JNE (Sprungbefehl nur wenn der Akku nicht den Wert 0 hat)
JLZ (Sprungbefehl nur wenn der Akkuwert kleiner als 0 ist)
JLE (Sprungbefehl nur wenn der Akkuwert kleiner oder gleich 0 ist)
JGZ (Sprungbefehl nur wenn der Akkuwert größer als 0 ist)
JGE (Sprungbefehl nur wenn der Akkuwert größer oder gleich 0 ist)
INP (Eingabe eines Wertes in die Registermaschine)
OUT (Ausgabe eines Ergebnisses)
HLT (Programmausführung wird beendet)
Meine Idee bisher (die linke Zahl stellt den Programmspeicher dar, die rechte den Datenspeicher (außer bei LDK):
00 INP 01 (Eingabe des Dividenden an Speicherstelle 1)
01 INP 02 (Eingabe des Divisors an Speicherstelle 2)
02 LDA 01 (Lädt den Akku mit dem Dividenden)
03 SUB 02 (Erniedrigt den Akkuwert um den Wert des Divisors)
04 STA 04 (Überträgt den Akku-Inhalt an die Speicherstelle 4 im Datenspeicher)
05 LDA 05 (Lädt den Akku mit dem Wert von Speicherstelle 5 (also 0))
06 LDK 1 (Die Zahl 1 wird in den Akku geladen)
07 STA 05 (Überträgt den Akku-Inhalt (also jetzt 1) an die Speicherstelle 5 im Datenspeicher)
08 LDK 0 (Akku wird geleert)
09 ADD 05 (Erhöht den Akkuwert (also jetzt 0) um den Wert an Speicherstelle 5 (also um 1))
10 STA 03 (Überträgt den Akku-Inhalt (also jetzt 1) an die Speicherstelle 3 im Datenspeicher)
11 JMP 02 (Sprungbefehl zurück zu 03 SUB 02)
12 OUT
13 HLT
Wie gesagt, es funktioniert leider nicht. Erkennt jemand meine Fehler?
LDA (Lädt den Akku mit dem Wert der Speicherstelle n)
LDK (Lädt den Akku mit einer bestimmten Zahl)
STA (Überträgt den Akku-Inhalt an die Speicherstelle n)
ADD (Erhöht den Akku-Inhalt um den Inhalt der Speicherstelle n)
SUB (Erniedrigt den Akku-Inhalt um den Inhalt der Speicherstelle n)
JMP (Sprungbefehl an eine bestimmte Speicherstelle (Schleife))
JEZ (Sprungbefehl nur wenn der Akku den Wert 0 hat)
JNE (Sprungbefehl nur wenn der Akku nicht den Wert 0 hat)
JLZ (Sprungbefehl nur wenn der Akkuwert kleiner als 0 ist)
JLE (Sprungbefehl nur wenn der Akkuwert kleiner oder gleich 0 ist)
JGZ (Sprungbefehl nur wenn der Akkuwert größer als 0 ist)
JGE (Sprungbefehl nur wenn der Akkuwert größer oder gleich 0 ist)
INP (Eingabe eines Wertes in die Registermaschine)
OUT (Ausgabe eines Ergebnisses)
HLT (Programmausführung wird beendet)
Meine Idee bisher (die linke Zahl stellt den Programmspeicher dar, die rechte den Datenspeicher (außer bei LDK):
00 INP 01 (Eingabe des Dividenden an Speicherstelle 1)
01 INP 02 (Eingabe des Divisors an Speicherstelle 2)
02 LDA 01 (Lädt den Akku mit dem Dividenden)
03 SUB 02 (Erniedrigt den Akkuwert um den Wert des Divisors)
04 STA 04 (Überträgt den Akku-Inhalt an die Speicherstelle 4 im Datenspeicher)
05 LDA 05 (Lädt den Akku mit dem Wert von Speicherstelle 5 (also 0))
06 LDK 1 (Die Zahl 1 wird in den Akku geladen)
07 STA 05 (Überträgt den Akku-Inhalt (also jetzt 1) an die Speicherstelle 5 im Datenspeicher)
08 LDK 0 (Akku wird geleert)
09 ADD 05 (Erhöht den Akkuwert (also jetzt 0) um den Wert an Speicherstelle 5 (also um 1))
10 STA 03 (Überträgt den Akku-Inhalt (also jetzt 1) an die Speicherstelle 3 im Datenspeicher)
11 JMP 02 (Sprungbefehl zurück zu 03 SUB 02)
12 OUT
13 HLT
Wie gesagt, es funktioniert leider nicht. Erkennt jemand meine Fehler?