Technische Beschreibung
Eigentlich ist es fr einen Simulator nicht notwendig eine technische Beschreibung zu erstellen,
es wird ja ohnehin alles nur simuliert.
Das Ziel ist jedoch, nicht nur die Programmierung auf dieser Ebene kennen zu lernen, sondern
gleichzeitig in die Architektur, in den technischen Aufbau, eines Rechners einzudringen. Die
Beschreibung geht deshalb sehr weit in die Technik, bis hin zum Mikroprogramm und zu einzelnen
Speicherelementen. Das muss man zum Programmieren nicht unbedingt wissen, erleichtert aber das
Verständnis fr notwendige Befehlsabläufe.
Sehr nützlich ist, wenn man sich deshalb einwenig in der Digitaltechnik auskennt -
die kleinen Kurse kann man gut dazu nutzen.
Wenn man mit der folgenden Beschreibung ein Maschinen-Programm geschrieben hat,
ist man ganz nebenbei ein Stück in die Rechnerarchitektur vorgedrungen. Natürlich
ist vieles vereinfacht, jedoch werden grundlegende Teile erklärt.
Der Rechner besteht im Wesentlichen aus drei Grundelementen:
Prozessor RSR Das Blockschaltbild zeigt den groben Aufbau des Prozessors. Er besitzt
|
Register
Register sind prozessorinterne Speicherplätze mit speziellen Funktionen:
Befehlsregister
Befehlsregister BR ist ein 4 Bit breiter
Speicher (es können 4 Bit gespeichert werden), es kann somit genau ein Wert aus
dem Hauptspeicher aufnehmen. Das Register wird unidirektional betrieben, d.h.
das Register kann nur Werte speichern, es kann aus ihm nicht gelesen werden.
Das Steuerwerk STW interpretiert diesen Wert generell als Befehl und startet ein
internes Mikroprogramm zur Abarbeitung des Befehls.
Da es keine Extrakodierung für einen Befehl gibt, wird bei fehlerhafter
Reihenfolge des
Assemblerprogramms auch ein Datenwert als Befehl interpretiert.
Diesen Fehler muss der Programmierer vermeiden, nicht der Rechner!
Akkumulator kurz Akku
Der Akku ist ein 4 Bit breiter Speicher, er funktioniert
bidirektional, man kann auf ihm Werte speichern und auch Werte aus ihm
lesen.
Die Darstellung zeigt, dass sowohl der Bus als auch das
Rechenwerk Zugriff auf das Register hat. Die Darstellung dazu ist vereinfacht,
denn im realen Aufbau wird für die exakten wechselseitigen Zugriffe ein
Umschalter gebraucht, das erledigt ein Multiplexer.
Der Akku wird vom Rechenwerk als Arbeitsspeicher, Hilfsspeicher und als
Ergebnisspeicher genutzt (siehe Akku).
Aus dem Zustand des Akku
können nach bestimmten Operationen, jedoch vorrangig aus dem Rechenwerks, Flags
generiert (siehe Flags).
Prinzipiell kann der Akku gleiche Funktionen wie ein
Speicherplatz im Hauptspeicher übernehmen, jedoch wird er bei der Durchführung
von Operationen planmäßig überschrieben,
so dass der Akku nicht für allgemeine Speicherzwecke genutzt werden kann.
Befehlszählregister oder kurz Befehlszähler BZ
Die Bezeichnung ist etwas unpassend, denn das Register zählt nicht die Befehle, organisiert die Adressenverwaltung des Hauptspeichers.
Üblicherweise braucht man zwei solcher Systeme, denn man muss zum Einen die Befehlsadresse bereitstellen, zum anderen aber auch die Adresse der Daten. In diesem kleinen System wird ein anderer Weg beschritten, indem zwischen beiden Zählern umgeschaltet wird, das Leitungssystem zum Speicher aber nur einmal angelegt wird. Das geht in der Realität auch, bereitet aber andere Probleme.
Der Befehlszähler BZ und der Hilfsbefehlszähler BZH sind jeweils 8 Bit breite Register (Speicher), BZ ist ein unidirektionaler Speicher, BZH ein bidirektionaler.
Warum 8 Bit breit?
Aus der Anzahl der Bits ist die Anzahl der möglichen
Kombinationen bestimmt, also 24 gleich 16 Kombinationen gleich 16
Werte (0 15). Damit könnte man 16 Adressen für den Speicher ausgeben,
das ist sicher zu
wenig! Deshalb wurde die Anzahl der Bits verdoppelt, man kann somit auf 28
Kombinationen gleich 256 Werte zugreifen das könnte schon mal reichen.
Man muss sich aber im Klaren darüber sein, dass das
Mehraufwand bei der Nutzung wird, es muss also immer zweimal in den Speicher
gegriffen werden bis die Adresse komplett ist. Wie nun daraus eine sinnvolle
Anordnung der 256 Speicherplätze erfolgen sollte ist in der Beschreibung des
Hauptspeichers festgehalten. Die so gestalteten Speicher sollten immer die
n-fache Breite des Basissystems haben (8, 12, 16 das gibt
es real), was sicher einzusehen ist, denn ein z.B. 7 Bit breites Register macht
noch viel mehr Arbeit.
Bei den Bildern zur Demonstration der Register BZ und BZR wird
der Ausgang von BZH nur im ersten Bild dargestellt, in der Folge aber
weggelassen.
Aufbau der Register
Beide Register sind in jeweils 4 Bit Speicher unterteilt,
die einzeln beschrieben werden können (Verbindung zum Bus). Die Teile werden
jeweils als höherwertiger Teil (hw) und niederwertiger Teil (nw) der
Adresse bezeichnet. Aus dem hw des BZ wird die Zeile
und aus dem nw
die Spalte des Hauptspeichers abgeleitet (siehe Hauptspeicher).
Nur der BZ dient zur Adressierung des Speichers.
Der BZ (8 Bit) besitzt weiterhin die Eigenschaft immer um 1 weiter zu zählen (daher die Bezeichnung Zähler). Das kann man mit spezieller Registergestaltung erreichen oder man muss das Rechenwerk, einschließlich eines kleinen Programms, bemühen!
Es muss natürlich erreicht werden, dass
wird, also über die 4 Bit hinaus gerechnet wird.
Eine weitere Leistung beider Register ist, dass der 8 Bit
Inhalt komplett getauscht werden kann.
Die Arbeitsweise soll an einem kleinen Beispiel dargestellt
werden:
Die Befehlskodierung wurde bereits in das Befehlsregister
transportiert, BZ wurde um 1 auf 21 erhöht. Nun muss die Adresse des Wertes
bereitgestellt werden.
Das kann nicht im BZ erfolgen, denn die Adresse 21 muss dort
bestehen bleiben.
Jetzt kommt das BZH in Aktion:
Flag-Register
In Abhängigkeit vom aktuellen Ergebnis des Rechenwerkes bzw.
des Akkumulators wird das Flagregister
verändert
Es wurden 4 Flags, die exakt an
einer Stelle auf dem 4 Bit Speicher stehen vereinbart:
An dieser Stelle muss man einige Erklärungen zu diesen Flags
geben.
Grundsätzlich geben sie die Möglichkeit eine
Programmverzweigung vorzunehmen, ohne diese wären also nur
Geradeaus-Programme möglich.
Zum anderen kann sich der Programmierer über bestimmte
Zustände bei der Bearbeitung informieren, d.h. Die Flags werden unabhängig vom
Willen des Programmierers gesetzt, er muss sie bei Bedarf entsprechend
auswerten!
Carry
Das Carry wird gesetzt, wenn der Hardwarebereich des
Rechners überschritten wird, also
Zero
Das Zero wird gesetzt, wenn alle Bits des Ergebnisses 0
sind, also
Die beiden folgenden Flags werden nur der Vollständigkeit halber mit genannt. Sie stellen Informationen bereit, um mit negativen Werten rechnen zu können, d.h. wieder sie werden unabhängig von der Nutzung gesetzt.
Negativ
Um einen Wert als negativ zu kennzeichnen wird
(üblicherweise geht eben auch anders) das 1.Bit eines Werten auf 1 gesetzt.
Das ganze ist jedoch weit aus komplizierter, denn wir arbeiten nun mit negativen
Werten nicht mit positiven Werten mit
negativem Vorzeichen. Also:
Noch ein Beispiel:
Allgemeiner gilt: 7 + 1 = -8 ... -1 + 1 = 0 usw.
Das hat meist schon jeder Programmierer festgestellt, Endlos-Zählschleifen bringen keine Probleme, denn der Wert wird irgendwann negativ und dann 0 und dann geht es wieder von vorne los. Und der Wertebereich geht in diesem Fall von -8 0 +7, das ist so richtig!
Überlauf Overflow V bzw. O
Es ist gar nicht so einfach das Problem zu beschreiben, es
ist auch oft falsch. Überlauf bedeutet, dass der Wertebereich überschritten
wird. Dieses Beispiel hatten wir schon:
Nicht die Änderung des Vorzeichens ist ein Überlauf, denn beim 2. Beispiel gibt es auch eine Änderung:
Die Realisierung der genannten Flags, es gibt viel mehr Flags, ist technisch nicht schwierig und sollte mit Kenntnissen der Digitaltechnik jedem möglich sein:
Rechenwerk ALU
Die Bezeichnung Rechenwerk für diesen Block ist eigentlich zu wenig, besser ist die Bezeichnung Arithmetisch-logische Einheit, denn neben den arithmetischen Operationen muss dieser Block auch logische Operationen ausführen können. Unser kleiner Prozessor soll neben den arithmetischen Funktionen Addition und Subtraktion auch die logischen Operationen AND, OR und XOR ausführen können.
An dieser Stelle soll eine kleine Erklärung zur Funktion dieser Einheit erfolgen. Die ALU braucht zumeist 2 Werte zur Bearbeitung. Das Problem ist aber nun, dass beide Werte im Hauptspeicher stehen und zur gleichen Zeit über den Datenbus bereitgestellt werden müssten, das geht nicht. Beim BZ haben wir schon gesehen, dass nur eine Speicheradresse bereitgestellt werden kann. Die Lösung ist, die Werte hintereinander über den Bus zu transportieren. Das bedeutet aber, dass der erste Wert im Prozessor gespeichert werden muss. Diese Funktion übernimmt der Akku, Schalter 3 geschlossen Multiplexer auf Bus. Ist der Wert Übertragen, wird Schalter 3 wieder geöffnet. Der zweite Wert wird vom Speicher auf den Bus gelegt, wird nun Schalter 1 geschlossen, kann die ALU darauf zugreifen, der erste Wert steht am Akku ebenfalls bereit. |
An diesem Beispiel sieht man, dass ein Reihe von Steuersignalen zum ordnungsgemäßen Ablauf erzeugt werden müssen und genau das ist die Aufgabe des Steuerwerkes!
Steuerwerk / Leitwerk
Das Steuerwerk, auch als Leitwerk bezeichnet, wird im Simulator nur teilweise exakt nachgebildet. In diesem Teil erfolgt die Steuerung des Ablaufes der Bearbeitung und die Verbindung von Soft- zur Hardware.
Es ist ein wesentliches Teil zur Funktion eines Rechners.
Zur Abarbeitung eines Befehls wird ein vorbereitetes Mikroprogramm gestartet. Die Bezeichnung Programm ist an dieser Stelle etwas hoch gegriffen, es ist nur das schrittweise Abarbeiten eines Schaltwerks, was z.B. die schon genannten Schalter steuert, so wie ein Schrittschaltwerk in einer Waschmaschine, mit dem in jedem Schritt genau definierte Aufgaben erledigt werden. Das sind sehr simple Aufgaben, wie Wasserventil auf, Heizung an usw. so auch im Mikroprogramm, eigentlich nur das Bedienen von Schaltern.
Um diesen Ablauf etwas zu verdeutlichen, soll einmal ein Maschinenbefehl zum Transport des Inhaltes eines Speicherplatzes des Hauptspeichers in den Akku sehr ausführlich beschrieben werden:
Die Transporte erfolgen offensichtlich etwa immer nach gleichem Schema:
Da gib es noch zwei Probleme:
Dazu müssen wir einfach noch tiefer ins System steigen und die Hardware zum Speichern bemühen:
Um nun herzufinden wie denn der Datentransport erfolgt, führen wir das Beispiel weiter:
Nun dürfte auch klar sein, dass der Inhalt des Empfängers
durch den neuen Wert überschrieben wird, der alte Wert geht verloren und aber
der Sender seinen Wert nach wie vor
behält.
Die nächsten Schritte sind sicher auch klar, es muss das
Taktsignal auf 0 gestellt werden, der Schalter DA und QC geöffnet werden.
Das erfolgt alles
zumeist nacheinander. Die neue Situation sieht nun so aus:
Unser Beispiel oben zeigt aber nun, dass wir genau das tun was verboten ist:
Niemals Ausgänge parallel schalten! Genau das tun wir aber mit der Anordnung, z.B. werden an den Ausgängen von QC und QB unterschiedliche Pegel angeboten. Da die Ausgänge relativ niederohmig sind, wird also durch beide ein zu großer Strom fließen, der die AND- Glieder zerstören wird. Deswegen zuvor die Aussage ein Relais wäre gut, das hat kein Problem damit. Wir brauchen eine andere Lösung. |
Die Kollektoren der Gatter werden alle parallel geschaltet. Wird ein Transistor mit 1 angesteuert, wird sein Widerstand klein, er legt den Ausgang auf 0. Negiert man das Signal kommt 1 heraus, das ganze wirkt nun wie ODER. Genau das wollen wir, der oder der Ausgang legt eine 1 auf den Bus, 0 zur selben Zeit geht nicht. |
Im unteren Teil wird das Programm binär beschrieben (1 Verbindung; 0 keine). Damit kann man den Mikrobefehl durch eine Dualzahl beschreiben, besser ist es jedoch Hexadezimal:
Soviel zum Steuerwerk des Rechners.
Befehlsliste
Mit den Bezeichnungen:
Hauptspeicher / Speicher
Der Hauptspeicher besteht aus 16 x 16 = 256 Speicherplätzen zu je 4 Bits (1 Nibble). Diese Speicherplätze werden als Matrix angeordnet. Jeder Speicherplatz lässt sich lesen und bespeichern. Die Funktion ist für alle Plätze gleich. Allerdings gibt es ein paar zusätzliche Festlegungen, die dann im Prinzip doch eine Einschränkung der freien Nutzung einiger Speicherplätze nach sich ziehen. Z.B. wird als erste Aktion beim Start eines Programms der Inhalt der Speicherplätze fe (nw) und ff (hw) in den BZ geladen, das entspricht der Startadresse. Damit besteht die Möglichkeit das Programm ab einer beliebigen Stelle im Speicher beginnen zu lassen das ist sehr gut. Auf den Speicherplätzen fa und fb wird vom Mikroprogramm die Rücksprungadresse bei der Nutzung eines Unterprogramms oder Interruptroutine die Adresse für die weitere Bearbeitung abgelegt. Auf den Plätzen fc und fd steht für einen möglichen Interrupt die Startadresse der Service-Routine. Noch eine Bemerkung zur Rücksprungadresse (fa, fb), es gibt nur die Möglichkeit eine Adresse zu speichern, heißt, es kann nur ein Unterprogramm zur Zeit bearbeitet werden. Wie sonst üblich, ein Stack zur Speicherung, ist nicht vorhanden, der Speicherplatz fehlt dazu. |
Die Speicherplätze 00 bis 08 sind für die Ein- und Ausgabe vorgesehen:
Die Funktion wird unten beschrieben.
Die Matrixanordnung der Speicherplätze macht sich sehr gut, denn der Speicherplatz befindet sich immer am Kreuzungspunkt von Zeile und Spalte, also Speicherplatz 20 liegt in der zweiten Zeile und der Null-ten Spalte. Zeile und Spalte sind ja bereits getrennt im BZ angelegt, so dass die Schalter für die Speicher mit einer AND-Funktion ausgewählt werden können. Die Auswahl der Zeilen und Spalten erfolgt mit einem Multiplexer 1 aus 16. |
Das wird in der Rechentechnik mit zwei Varianten gelöst:
Eingabe <00>
Die Eingabe erfolgt im Polling-Verfahren.
Wird der Wert vom Speicherplatz <00> mit dem Befehl LDA 0 0 in
den Akku transportiert, erwartet das System eine Tastatur-Eingabe. Das Programm
führt diesen Befehl erst aus, wenn eine Taste betätigt wurde, transportiert ihn
in den Akku.
Entsprechend der 4 Bit Darstellung können nur Werte (Tasten)
0 9 a b c d e f übernommen werden, alle anderen Tasten werden negiert, der
alte Wert aus <00> wird übernommen!
Die Eingabe wird nicht durch Enter
bestätigt.
Ausgabe <01>
Die Ausgabe sieht im Prinzip einfach aus, hat es aber in
sich, hier wurde mehr als zunächst sichtbar, eingebracht. Es sollten nicht nur
einstellige Zahlen der Eingabe wieder ausgegeben werden können, sondern mehrstellige,
in verschiedenen Zahlensystemen und auch kurze Texte!
Das geht folgendermaßen:
An der Ausgabe hängt symbolisch eine Ausgabeeinheit, die
weitere Möglichkeiten der Ausgabe organisiert:
Prinzipiell stehen 10 Stellen für die Ausgabe zur Verfügung.
Standardmäßig wird die Stelle 0 bedient, dort landen alle Zahlen. Will man die
anderen Stellen beschreiben, muss zuvor die Position verändert werden.
Das geht mit Zwei-Wort-Ausgaben, wir haben ja noch die Werte a bis f zur Verfügung. |
- Position einstellen
z.B.
- Ausgabe Sonderzeichen
Um eine weitere Gestaltung der Ausgabe zuzulassen, sind
Sonderzeichen vereinbart worden.
Die Ausgabe erfordert wieder 2 Aktionen:
- Ausgabe Textzeichen
Hier wird wie bei den Sonderzeichen verfahren:
z.B. auf <01> wird die angegeben Zeichenfolge nacheinander gespeichert:
Wider Erwarten ist mit der Ausgabe eine Menge an Informationen darstellbar.
Symbolische Ausgabe-Einheiten (Versuche)
Die so gestaltete Ausgabe lässt eine Menge
Programmieraufgaben zu, die sichtbare Ergebnisse bringen. Aber, es sind noch
zwei weitere Möglichkeiten vorgesehen. Es werden Einheiten mit Quasi-LED-Balken
zur Ansteuerung bereit gestellt. Die
Ansteuerung ist einfach über die Speicherplätze <02> <08>
möglich. Wird auf einem dieser Speicherplätze eine 1 gespeichert so wird in der
aktivierten Einheit der LED-Balken angesteuert, er wird rot dargestellt, bei 0
grau.
Die Einheiten werden als Versuche bezeichnet und mit Eingabe
von V1 oder V2 aktiviert. Mit V0
werden sie wieder beseitigt.
Und so sieht der Versuch V2 aus:
Versuch V1:
Nun sollte genügend Übungsmaterial vorhanden sein.
Programmieren mit dem Rechner
Ein so primitiver Rechner - wie soll das gehen?
Folgende Aufgabe gilt es zu lösen:
Genutzt wird eine Zählschleife. Um dieses Problem in die
Maschinensprache umzusetzen, müssen die leistungsstarken Konstruktionen, wie
eben die for-Schleife, aufgelöst werden. Man kann
diese Auflösung auch in Pascal vornehmen.
Im ersten Schritt setzen wir eine Bedingungsschleife ein:
Der Programmierer muss sich nun bereits um das Erhöhen des
Wertes i kümmern.
Eine weitere Aufschlüsselung geht, wenn man sich von den
Schleifen-Konstruktionen trennt. Das hat jedoch sofort den Einsatz von
Sprunganweisungen zur Folge, was man ja eigentlich nicht tun sollte, aber
Maschinensprachen kennen meist keine Schleifenkonstruktionen. Das Programm
könnte sich wie folgt ändern:
In einer if-Anweisung wird entschieden, ob ein Rücksprung notwendig ist oder das Programm beendet werden kann. Allerdings wurde dazu die Abfrage geändert (i>15 in i<=15). Sollte diese Umkehrung auf Grund des Befehlsvorrates des Prozessors nicht möglich sein, dann kann das Problem mit einem weiteren Sprungbefehl auch gelöst werden:
Diese Lösung nehmen wir als Basis für die Realisierung der Aufgabe mit unserem Rechner:
ldk | 1 | ;Akku wird mit dem Wert 1 geladen | |
spa | 02 | ;Akku-Inhalt (also 1) auf Speicherpl. 02 speich. | |
m1: | spa | 01 | ;Akku-Inh. auf Speicherpl. 01 speich. - Ausgabe |
add | 02 | ;Akku = Akku + Inh. Speicherpl. 02 ( A = A + 1) | |
spc | m2 | ;Sprung zu m2 wenn C = 1 also größer als 15 | |
sp | m1 | ;wenn nicht, dann weiter bei m1 | |
m2: | sp | m2 | ;Rechner bleibt in der Zeile (weil kein Ende) |
Ein gewichtiges Problem gibt es aber noch - diese
symbolische Beschreibung kann der Rechner nicht lesen, er braucht die
Zahlenfolgen in hexadezimaler Schreibweise!
Dieses muss nun der Nutzer mit Hilfe der Befehlsliste selbst durchführen
Jetzt ist es wichtig, den Speicherbelegungsplan zu kennen,
denn bestimmte Speicherplätze haben für ausgewählte Befehle eine
Speicherfunktion, z.B. kann das Programm nicht bei 00 beginnen, das war die
Eingabe.
Legen wir also fest, es geht bei 20 (hex) los. Sinnvoll ist
es, eine Tabelle anzulegen:
1.Befehl:
ldk 1 | 20 1 1 | |||
spa 02 | 22 2 2 0 | <- Code=2; nw=2; hw=0; Adr=adr+3 | ||
m1: | spa 01 | 25 2 1 0 | <- Speicherpl.01 - Ausgabe | |
add 02 | 28 3 2 0 | |||
spc m2 | 2B D 1 3 | <- wenn Bed. erfüllt, Sprung zu Adr.31 | ||
sp m1 | 2E C 5 2 | <- m1 hat die Adr. 25 | ||
m2 | sp m1 | 31 C 1 3 | <- bleibt in der Zeile |
In der realen Computerwelt sieht das nicht wesentlich anders
aus. Der Zeichensatz eines Computers verwendet 8 Bit. Stellt man nun das
Maschinenprogramm einer exe-Datei mit einem
Textsystem dar, wird die Bitfolge in 8-er Schritten dargestellt. Da das
Textsystem nun versucht alle 8 Bit Kombinationen darzustellen, kommt in der
Regel unlesbares Zeug heraus.
Im Folgenden wurde einmal ein Stück von avcenter.exe dargestellt
MZ ÿÿ ¸ @ º ´ Í!¸LÍ!This program cannot be run in DOS mode. $ )`ÖmòmòmòJÇòÐNdlòdygjòdyqDòdyvpòdyadòmó¿[1]òJÇlòdyxvòsSflòdyclòRichmò PE L â¹êK
à [1] E ÀtÎè:¾ ÆEüMèÿ¨»C j\èF' YEìÆEü ;ÇtPèÑa ë[1]3ÀÆEü¨ ;ÇuMüÿE Pè3` éFÿÿÿWWÈÿR¨ H ÿ| E ÀtWjh°ëC èá& Wÿì²C €}Êu ¨ Æ@0€}Ð tSèó ëÛÿsHMäÿ »C ÆEü ¾¼îC VhüëC Mäÿ$»C VhìC Mäÿ$»C MäÿpºC }èCH;Çuf98tOj ÿL |
Man findet sogar lesbaren Text darin und auch manchmal Versions-Nr. usw. Das kann man natürlich auch ändern, nicht mit Word höchstens mit einem einfachen Editor, aber es gibt Kontrollmechanismen, die das Programm dann garantiert nicht mehr laufen lassen.
Monitor / Simulator
Unser Programm ist fertig, aber wie wird es in unseren Simulationsrechner gebracht?
An dem Wort Simulator sollte man sich nicht stören, denn
simuliert wird nur der Prozessor. Die Bedienebene in der angegeben Art ist bei
Systemen zur Entwicklung und Testung von Maschinenprogrammen für industriellen
Prozessoren üblich.
Man bezeichnet sie auch als Monitor.
Das Monitorprogramm für unseren Prozessor wurde bewusst kurz
gehalten, was natürlich Konsequenzen für den Komfort hat. Der Monitor tritt wie
folgt in Erscheinung:
Das soll der Bildschirm sein, bzw. ein DOS-Fenster (die Proportionen stimmen nicht). Die Zeilen stehen am unteren Rand des Bildschirmes. Die Bedienung erfolgt ausschließlich über Tasten. |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
2 | 1 | 1 | 2 | 2 | 0 | 2 | 1 | 0 | 3 | 2 | 0 | D | 1 | 3 | C | 5 | |
3 | 2 | C | 1 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Mit Run oder Trace wird nun das Programm gestartet. Auf dem Bildschirm erscheint folgendes Bild:
Um die Arbeit etwas zu vereinfachen, kann mit Save und Load der Inhalt des
Speichers in eine Datei gespeichert
oder von dort gelesen werden.
An diese Stelle sollte man schon darauf achten, dass die
gespeicherten Programme die Erweiterung .SIM haben sollten, das wird später
gebraucht, dann ist alles kompatibel!
Simulator 2
Der ist natürlich viel besser als der eben genannte.
Nutzung Simulator
Der Simulator 2 ist unter der speziell für diesen Prozessor erarbeiteten
Bedienoberfläche"asm_4816.exe"
erreichbar. Die Nutzung des Systems, einschließlich Simulator wird auf der Seite
"Simulator ERNA"
vorgestellt.
Der Simulator steht als Programm "tr4.exe" zur Verfügung.
Was noch fehlt ist das maschinelle Erzeugen des
Maschinenprogramms aus einer für uns lesbaren Quelle, das tut ein
Assembler
.
Ein
Dis-Assembler
(auch Re-Assembler) ist auch vorhanden, er vermag ansatzweise
ein Maschinenprogramm in eine Quelle zurückwandeln das Ding macht immer
Probleme.
Weiterhin ist ein übergeordnetes Steuersystem zum Aufrufen
der Teilkomponenten vorhanden. Alle diese Dinge sollen in einem Extrateil
beschrieben werden.
Alle Programme stehen unter erna_dat.htm zur Verfügung.
zurück zur Start-Seite / weiter Assembler |