Hier sollte die Ausgabe des Java-Applets "Von-Neumann-Rechner - Laden und Speichern" erscheinen. Wenn Sie statt dessen diesen Text sehen, unterstützt ihr Browser kein Java!
Es ist ihnen sicherlich schon aufgefallen: Anders als oben
behauptet, besitzt unser VNR vier Register. Das bisher verschwiegene
"Hilfsregister", welches von LDA mem indir. und STA
mem indir. benutzt wird, ist aber nicht von so fundamentaler Wichtigkeit
wie die anderen drei, denn die beiden genannten Befehle lassen sich problemlos
durch andere emulieren (der Kürze wegen wollen wir von nun an "LDA
10" statt "LDA mem 10" und "LDA (10)"
statt "LDA mem indir. 10" schreiben; entsprechend steht
"STA 11" für "STA mem 11"):
Nehmen wir, sicherlich ohne Beschränkung der Allgemeinheit, den
Befehl LDA (10). An Adresse 10 befinde sich der Wert 20, an Adresse
20 wiederum der Wert 30. Am Ende der Ausführung von LDA (10)
muß also 30 im Akkumulator stehen. Das Problem ist, daß sich
während der Ausführung des Programmes der Wert an Adresse 10
ändern wird - dieser Wert ist ein sogenannter Zeiger, bliebe
er konstant, wäre das LDA (10) unnötig und könnte
durch LDA 20 ersetzt werden. Wir müssen es schaffen, jedesmal
dann, wenn LDA (10) ausgeführt werden soll statt dessen ein
LDA x auszuführen, wobei x der Wert von Adresse
10 ist.
Dabei kommt uns zustatten, daß der VNR einen gemeinsamen Speicher
für Daten und Befehle besitzt; wir können eine Zahl in den Speicher
schreiben und den VNR diese als Befehl ausführen lassen. Man spricht
dann von selbstmodifizierendem Kode. Das Befehlswort für LDA
x besteht aus einem höherwertigen Byte für den Befehlskode
(11 hexadezimal für LDA mem) und einem niederwertigen Byte
mit der benötigten Adresse. Ein LDA 17 läßt sich
also erzeugen als 1100 + 17 (hexadezimal).
Wir ersetzen nun LDA (10) durch
Adresse | Befehl/Wert | Erläuterung |
n | LDA 10 | Worauf zeigt der Zeiger? Auf Adresse 20. |
n+1 | ADD F0 | An Adresse F0 steht der Befehlskode für LDA mem. |
n+2 | STA n+3 | An Adresse n+3 das Befehlswort "LDA 20" erzeugen. Der Wert n+3 ist uns beim Erstellen des Programmes bekannt, es ist also keine weitere Addition notwendig! |
n+3 | LDA 20 | Diesen Befehl haben wir gerade selbst erstellt! |
10 | 20 | Nur zur Erinnerung. |
20 | 30 | Nur zur Erinnerung. |
F0 | 1100 | Befehlskode für LDA mem. |
Analog kann man, ohne die Universalität des VNR einzuschränken,
STA mem indir. ersetzen.
Carsten Kelling 1996 (); letzte Änderung: 21. Februar 1997 |