Schlagwort-Liste: Simulator 4-Bit-Rechner - Assembler - allg. Beschreibung Assembler - Assembler-Befehle - Darstellung Maschinenprogramm

Assembler (SIMulator) ASIM zu ERNA1

Das Programmierbeispiel zum Rechner ERNA1 zeigt, dass neben den Schritten zur Aufstellung des Algorithmus ein aufwendiger handwerklicher Teil zum Umsetzen des Symbolischen Programms in die Maschinensprache notwendig ist.
Wie zu jedem anderen Prozessor, steht auch für diesen Rechner ein Programm zur Verfügung, welches diese Umsetzung vornimmt. Solche Programme heißen Assembler.

Neben der eigentlichen Umsetzung des Programms werden meist zum vorhandenen Befehlsvorrat, der sich auf den Prozessor bezieht, weitere Organisationsbefehle angefügt. Diese erleichtern das Schreiben des Programms.
Zusätzlich zur symbolischen Darstellung der Prozessorbefehle, man nennt diese Mnemonik, kann auch mit symbolischen Adressen gearbeitet werden. Die Verwaltung des Speichers muss jedoch jeder Nutzer selbst betreiben.
Programme, die mit den symbolischen Befehlen arbeiten, sollen als Assembler-Programme bezeichnet werden.

Aufbau des Assemblerprogramms

Die Regeln für den Aufbau des Assemblerprogramms sind nicht allgemeingültig, sondern beziehen sich auf diesen speziellen Prozessor. Prinzipien sind natürlich gleich, generell braucht aber jeder Prozessor-Typ seinen eigenen Assembler.

Assemblerprogramm:

Folge von Zeilen (für ASIM wurde die Zahl der Zeilen auf 100 begrenzt).

Eine Zeile kann enthalten:

Befehlszeile
Kommentarzeile
Leerzeile

Jede Zeile kann nur eine Aktion enthalten!

Kommentarzeile:

Als erstes Nicht-Leer-Zeichen in der Zeile (Zeilenanfang) muss ein ; stehen.
Die nun folgenden Zeichen sollten nur Textzeichen, Zahlen oder Punkt und Leerzeichen enthalten, andere Sonderzeichen können Fehler verursachen!
Eine Ende-Kennung ist nicht notwendig, da nur eine Aktion in der Zeile zulässig ist.

Befehlszeile:

Als Befehlszeilen sind zulässig
  • Prozessor-Befehle
  • Organisations-Befehle

Eine Befehlszeile hat folgenden Aufbau:

Markenfeld Operatorfeld Operandenfeld Kommentarfeld

Die Felder werden durch mindest 1 Leerzeichen getrennt.
!!! Tabulatoren sind unzulässig !!!

Markenfeld und Kommentarfeld kann entfallen.

Markenfeld:

Das Markenfeld wird durch einen ":" abgeschlossen.
Die Marke selbst ist eine Folge von maximal 8 beliebigen Zeichen
(außer: Groß- und Kleinschreibung ist gleich).

Operatorfeld:

Dieses Feld enthält:

  • symbolischen Befehle (Mnemonik) des Prozessors
  • Organisations-Befehle

Symbolische Befehle (Mnemonik):

Siehe dazu Befehlsliste in Beschreibung Simulator 4 Bit Prozessor!

Org-Befehle:

Organisations-Befehle gehören nicht zum Befehlsvorrat des Prozessors, sie steuern den Ablauf und Ziele der Assemblerbearbeitung des Programms.

EQU     Markenfeld und Operandenfeld muss vorhanden sein;
setzt die Marke (neues Symbol) mit dem Wert des
Operandenfeldes gleich (Operand muss ein zweistelliger
Zahlenwert sein). z.B.:

aus: equ 01

das Symbol "aus" ist gleichbedeutend mit der
Adresse 01
 
ORG     Mit der Org-Anweisung wird festgelegt, ab welcher
Speicherplatzadresse die Übersetzung erfolgen soll, z.B.:

org 20

Die Übersetzung speichert das Maschinenprogramm ab
Speicherplatz 20 in den Speicher
 
KON     speichert am aktuellen Speicherplatz den im
Operandenfeld von KON angegebenen Wert ab, z.B.:

org fe
kon 5
kon 2

Auf Speicherplatz FE wird der Wert 5 und auf FF
der Wert 2 gespeichert. Der Prozessor würde nun
das Programm ab Adresse 25 starten.
KON erhöht automatisch die Speicherplatzadresse um 1!


Operandenfeld:

Das Operandenfeld enthält entsprechend dem verwendeten Befehl Adressen, Konstanten oder es kann weggelassen werden.
Das Feld kann Zahlen (hexadezimal) oder Symbole enthalten.
Wird ein Symbol verwendet, so muss es einen Bezug zu einer Marke geben.

Kommentarfeld:

Als viertes Feld kann ein Kommentarfeld folgen. Es wird mit einem ";" eingeleitet. Der Rest der Zeile ist Kommentar
Die nun folgenden Zeichen sollten nur Textzeichen, Zahlen oder Punkt und Leerzeichen enthalten, andere Sonderzeichen können Fehler verursachen!

Beispiel:

Als Beispiel soll wieder das im Simulator beschrieben Programm verwendet werden.


Das Beispiel zeigt weitere Möglichkeiten. Als Adresse werden immer hexedezimale Zahlen erwartet, sie kann aber einstellig sein.
Die beiden letzten Befehle dienen der Festlegung der Startadresse, also 20, da beginnt ja auch unser Programm.

Nutzung des Assemblers

Das Assemblerprogramm wird entsprechend den oben angegebenen Regeln mit einem ASCII-Editor geschrieben und mit dem Namen:

name.ASI

gespeichert.

Als Editor kann man den „Editor“ aus Zubehör von Windows verwenden.
!!! keine Tabulatoren verwenden !!!
Word“ eignet sich schlecht als Editor, man kann jedoch dort den Text unter TXT-Datei speichern.
Eine andere auch nicht gerade sehr gute Möglichkeit gibt es unter der integrierten später noch dargestellten Bedienoberfläche zum gesamten Assembler-System sehr sehr alten Editor.

Der Start des Assemblers erfolgt auf der Kommandoebene im Eingabefenster (meist unter Programme und Zubehör).
Mit Laufwerk:<Enter> und entsprechend vielen Eingaben von cd Verzeichnis <Enter> kommen wir zum Verzeichnis mit dem Assembler und unsere Quelle b1.asi
Der Start des Assemblers erfolgt wie folgt:

ASIM1 name.ASI (das Assembler-Programm wird als Parameter mit angegeben)

oder

ASIM1

Das Programm fordert den Nutzer auf, einen Programmnamen anzugeben. Ist dieser falsch, wird der Assembler sofort beendet. Die Datei und der Assembler sollten im gleichen Verzeichnis stehen.


Treten beim Übersetzen Fehler auf, so werden die entsprechenden Zeilen auf dem Bildschirm ausgegeben (nicht das ganze Programm).
Am Ende der Übersetzung erfolgt eine Ausgabe zur Anzahl der Fehler. Hat das Programm keinen Fehler, gibt es nur die Ausschrift

0 Fehler

Der Assembler legt generell beim Übersetzen eine Datei name.LST an. Diese enthält eine Zeilen- und Adressenzählung, den übersetzten Code, die symbolische Schreibweise und Fehlermeldungen. Diese Datei ist eine Textdatei, sie kann gedruckt werden. z.B.:


An dem Beispiel ist zugleich die gesamte Darstellung zusehen:

Spalten 3, 4, und 5 sind zusammen das Maschinenprogramm, also

1 1 2 2 0 2 1 0 3 2 0 D 1 3 C 5 2 C 1 3

Diese Folge wird in der Datei „b1.sim“ gespeichert (siehe unten).

An dem Beispiel kann man auch sehen, wie der Assembler Sprünge organisiert. Zeile 08 enthält einen Sprung zur Marke m1. Wir wissen nun schon, dass ein Sprung in der Bearbeitungsfolge nur das laden des Befehlszählers mit der neuen Adresse ist. Die neue Adresse steht hinter der Kodierung für den Sprung (niederwertiger höherwertiger Teil).

In dem Beispiel sieht man auch, dass die ORG-Befehle nicht übersetzt werden. Bei KON wird einfach der Wert auf dem aktuellen Speicherplatz abgelegt. Man könnte mit nur KON-Befehlen auch ein Programm schreiben. Hier der Beweis:


Es wird nur die Zeichenfolge des schon übersetzten Programms, das Maschinen-Programm, eingetragen. Das Ganze ist so natürlich Unsinn, wir übersetzen ein übersetztes Programm noch einmal, zeigt aber, was möglich ist.

Die Quelle „b1.asi“ wurde nun mit einem Fehler versehen (in Zeile 06 wurde add zu ad geändert).
(in den beiden fehlerhaften Programmen wurde die Festlegung der Startadresse weggelassen!)
Der Assembler reagiert nun wie folgt:

*** Assembler ASIM zum Prozessor ERNA1 ***©RR***
06   20 ?   <F:07 ad 2 ; Fehler
1 Fehler <ET>

Und dazu die LST-Datei:


Fehler sind nicht immer einfach zu sehen, wieder wurde add geschrieben und doch ist die Zeile fehlerhaft z.B.


Dies ist völlig unklar, denn add ist richtig geschrieben, wie kann es da einen Fehler geben. Zuerst schimpft man auf den Rechner und das Assembler-Programm – da liegt aber nicht der Fehler!

add 2

bringt eine Fehlermeldung:

06   28   3 ? ?   <F:9   add 2

Das ist nun überhaupt nicht einzusehen.

F:9 - Marke/Opd fehlt (Opd - Operand)

Das zeigt an, dass eventuell ein Operand fehlt – Unsinn, ist vorhanden? Jedoch wurde zwar add kodiert (die 3), der Operand 2 aber nicht (? ?)!
Es ist ganz wichtig, jeden Hinweis zu untersuchen, also den Operand. Dazu stellt man den Kursor hinter die 2 und fährt nach rechts – und siehe da, da gibt es noch ein Leerzeichen (oder ein anders Zeichen, die der Bildschirm nicht anzeigen kann (unter 20h)) bevor es in die nächste Zeile geht! Das Leerzeichen ist Trennzeichen zum Kommentar und den gibt es aber nicht, da haben wir den Fehler.
Das konnte man auch an der Fehlermeldung sehen, es wurde versucht 2 Operanden zu übersetzen, also stehen da zwei Frage-Zeichen!
Soviel zu Fehlern.

Damit ist der wesentliche Schritt getan, man braucht nur noch die Hexfolge abzuschreiben und schon könnte unser Programm laufen. Da der Simulator aber über eine Load-Funktion verfügt, kann auch gleich eine entsprechende Datei hergestellt werden.

Ist die Überstzung ohne Fehler werden automatisch zwei weitere Dateien angelegt:

  • name.SIM
  • name.SBP

Es wird immer „name“ geschrieben, das bedeutet, dass immer der Name vom Quellprogramm verwendet wird und nur durch eine andere Erweiterung ergänzt wird (das galt auch schon für die LST-Datei).

"name.SIM" ist das vom Simulator ladbare Maschinenprogramm. Es wird immer der gesamte Hauptspeicher von 256 Werten angelegt. Sichtbar ist dies in der SBP-Datei.

"name.SBP" entspricht dem Maschinenprogramm, jedoch erfolgt eine Textausgabe, so dass ein Druck erfolgen kann.
Die Erweiterung .SBP steht für Speicher-Belegungs-Plan.
Für unser Beispiel ergibt sich folgendes Bild:


Gut zu sehen ist das Programm ab Speicherplatz 20 aber auch die 2 auf Speicherplatz FF.

Treten Fehler auf, werden die letzten beiden Programme nicht angelegt.

!Achtung:
Beim Anlegen der Dateien .LST, .SBP und .SIM wird nicht kontrolliert, ob diese Dateien bereitsexistieren, sie werden generell neu angelegt (sollten Dateien mit gleichem Namen existieren, so werden sie zerstört) !

Anzeige SIM-Datei

Das Maschinenprogramm unseres Simulators, die SIM-Datei, ist eigentlich kein Maschinenprogramm, es ist ja nur simuliert!
Aber es bereitet doch erhebliche Probleme es auszulisten. Der Grund dafür ist ganz einfach, denn wir haben Nibbles (4-Bit), diese können so nicht gespeichert werden. Eine handhabbare Einheit ist Byte und in diese werden die Nibbles rechtbündig eingeordnet. Aus
z.B 5(16) wird 0101(2) und in Byte eingeordnet 0000 0101.
Diese Bitfolge soll durch Textsysteme dargestellt werden. Dazu muss man wissen, das alles unter 20(16) also 0010 0000(2) von verschiedenen Ausgabegeräten sehr unterschiedlich als Steuerzeichen interpretiert werden, es passiert vielleicht etwas, aber es ist nicht zu sehen. Die meisten Textsysteme zeigen irgendwelche Zeichen.
Nimmt man die Ausgabe mit dem Editor vom Windows-System vor, sieht das so aus:

Man kann das auch mit dem Browser probieren, denn es gibt die Möglichkeit diese Zeichen als Zahl einzugeben. Mit &#xx; kann man alle Zeichen eingeben (xx - Zahl (kann auch 3-stellig sein)).
Es wurden mal in dieser Form die Zeichen zwischen 00 bis 15 aufgeschrieben und davor in Klammern immer die darzustellende Zahl:

(00)� (01) (02) (03) (04) (05) (06) (07) (08) (09) (10) (11) (12) (13) (14) (15)

Das Ergebnis ist nicht allgemeingültig!

Der Browser von Mozilla Firefox stellt das anders als der Internet Explorer dar. Von 09 bis 13 lassen beide alles weg, unterschiedlich mit 00, diese Zahl ist immer mit Vorsicht zu behandeln! Andere Browser werden wieder anders reagieren.
So ist das mit der Textdarstellung unserer SIM-Datei. Man kann es auch mit einem anderen System z.B. mit Word versuchen, das sieht nicht besser aus:

Der nächste Schritt wäre, eine Ausgabe in ein DOS-Fenster zu organisieren.
Das geht einfach mit der "Eingabeaufforderung" vom Windows-Systems. Auf der Ebene kann man mit Kommandos das System steuern (findet man unter "help"). Entweder man bewegt sich in das Verzeichnis der SIM-Datei oder man gibt den Pfad mit an und dann mit dem Kommando "type" gefolgt von Leerzeichen und SIM-Datei-Name, erhält man eine Ausgabe, zwar mit Sonderzeichen, aber völlig unbrauchbar:

Es bleibt also nur nach speziellen Programmen zu suchen, die eine Ausgabe für diesen Fall erzeugen können.

Der "Viewer" aus dem DOS-System kann das sehr gut.
Links stehen die uns bekannten Adressen, danach in 4 mal 4 Feldern die Werte(16) und danach rechts was das System als Zeichen ausgeben würde.
Nun sieht man auch, dass die Festlegung des Speichers von unserem Rechner sehr gut war, es passt exakt in dieses Schema!
Und wir sind verdammt nah am realen Maschinenprogramm.
Das werden wir später am Prozessor 80x86 beweisen.

Und nun kann der geübte Maschinenprogrammierer auch sehen, dass die Ausgabe im Eingabefenster gar nicht so verkehrt war. Wenn man in diesem Fenster einmal durchzählt, wie viele Werte ausgegeben wurden, zählt man 8, vermutlich die letzten 8 Werte.
Vergleicht man das mit dem Viewer (blaues Fenster), sieht man rechts die gleichen Bildchen wie im schwarzen Fenster, aber links auch die Codierung und das entspricht unserem simulierten Maschinenprogramm.
Nach den 8 Zeichen steht entsprechend unserem Maschinenprogramm ein 0D, und da steckt das Problem. Der Viewer zeigt dafür ein Bildchen, das schwarze DOS-Fenster "führt das Zeichen aus". Der Wert 0D wird als "Druckersteuerzeichen" interpretiert:

0A - Vorschub in die nächste Zeile
0D - zurück zum Zeilenanfang

Nun ist die Ausgabe verständlich, denn alles was vor 0D ausgegeben wurde, wird überschrieben!
Die uns bekannte Aktion, wenn wir in einem Textsystem die ENTER-Taste betätigen und dann an den Anfang einer neuen Zeile kommen, setzt sich immer aus 0A und 0D zusammen.
Wir wollen das testen. Dazu ändern wir die Zeichenfolge, indem wir in dem "sinnlosen" Programm mit den nur KON-Befehlen einfach vor dem KON D ein KON A schreiben. Das ist nun ein total unsinniges Programm, aber in der Folge taucht nun ein "Quasi ENTER" auf, also müsste nun alles ausgegeben werden:

Und es geht!

In der Darstellung ist zugleich gezeigt wie man auf das Laufwerk und in das Verzeichnis kommt.
Noch etwas fällt auf, in einer weiteren Zeile gibt es noch ein Zeichen! Das ist die 2 auf Speicherplatz FF, die Startadresse. Warum die nun auch in einer neuen Zeile dargestellt wird, liegt sicher an der Tatsache, dass das DOS-Fenster nur 80 Zeichen pro Zeile darstellen kann.
Man muss also sehr genau hinschauen und analysieren.

zurück zur Start-Seite   /   Assembler Simulator