Lernpfad Know-How-Computer/Know-How-Assembler
Assembler - was ist das?
Größere Programme, die in Maschinensprache geschrieben sind, können für Menschen leicht unübersichtlich werden. Aus diesem Grund wurde eine Art Zwischensprache erfunden, die als Assembler bezeichnet wird. In ihr werden zwar im Prinzip die gleichen Befehle benutzt wie in der Maschinensprache, aber für die Speicheradressen werden keine Zahlen, sondern Buchstaben und Wörter verwendet, unter denen ein Mensch sich etwas vorstellen kann und die für ihn im Programmzusammenhang eine Bedeutung besitzen. Solche Adressnamen werden auch als symbolische Adressen oder Labels bezeichnet - im Gegensatz zu den numerischen Adressen, die in der Maschinensprache verwendet werden müssen. Die Labels von Speicherzellen, die Datenwerte enthalten, sind quasi Variablennamen. (Eigentlich sind die von uns bisher verwendeten Maschinenbefehle inc, dec usw. auch schon symbolische Bezeichner - im Unterschied zu einer echten Maschinensprache, in der auch die Befehle durch Zahlen dargestellt werden. Aber aus Gründen der besseren Lesbarkeit haben wir beim KHC von vornherein Befehlsnamen verwendet, die wenigstens als Abkürzungen erkennen lassen, welche Bedeutung sie haben.)
Ein Programm zu entwickeln und zu verstehen ist in der Assemblersprache für Menschen zwar oft leichter als in Maschinensprache. Aber damit das Programm auch tatsächlich von einer Maschine "verstanden" und ausgeführt werden kann, muss es in die Maschinensprache übersetzt - man sagt auch "assembliert" werden. Bei den sehr komplexen Maschinensprachen realer Computer gibt es dafür eigene Übersetzungsprogramme, die auch einfach kurz Assembler genannt werden. Der Begriff Assembler wird manchmal sowohl für das Übersetzungsprogramm als auch für die Assemblersprache verwendet.
Von der Maschinensprache zur Assemblersprache
Wie so ein Assembler-Programm aussieht, soll am Beispiel des bereits bekannten Programms "Von x auf 0" verdeutlicht werden. Hier zur Erinnerung noch mal das Programm in Maschinensprache:
"Von x auf 0" in Know-How-Maschinensprache
1: isz 6 2: jmp 4 3: stp 4: dec 6 5: jmp 1 6: 3
In der Zelle mit der Adresse 6 steht derjenige Datenwert, der von dem Programm bis zur 0 heruntergezählt werden soll - im Beispiel der Wert 3. An Stelle des numerischen Adresswertes 6 verwenden wir nun den Variablennamen x. Außerdem vergeben wir aussagekräftige Namen für die vorkommenden Sprungadressen: Den Label-Namen start für die Adresse 1 und den Labelnamen xminus1 an Stelle der Adresse 4. Alle anderen numerischen Adressen lassen wir einfach weg. Das Listing sieht dann in der Know-How-Assemblersprache so aus:
"Von x auf 0" in Know-How-Assemblersprache
start: isz x
jmp xminus1
stp
xminus1: dec x
jmp start
x: 3
Von der Assemblersprache zur Maschinensprache
Wenn man ein Programm erst mal fehlerfrei in Assemblersprache geschrieben hat, kann es anschließend ziemlich leicht in den entsprechenden Maschinencode übersetzt werden. Um das Prinzip zu erklären, gehen wir der Einfachheit halber davon aus, dass in jeder Zeile des KHA-Programms genau ein Befehl steht - eventuell mit einem Label davor. Das Assembler-Übersetzungsprogramm funktioniert dann so:
Bei unserem Programm "Von x auf 0" in Know-How-Assemblersprache läuft dieses Übersetzungsverfahren beispielsweise in folgenden Schritten ab:
1. Zeile: Da vor dem Doppelpunkt der Label-Name start steht, wird dieser durch die aktuelle Zeilennummer, also durch den Wert 1 ersetzt. Anschließend wird auch in der fünften Zeile die Zeichenkette start durch Wert 1 ersetzt:
1: isz x ... jmp 1
2. und 3. Zeile: Da diese beiden Zeilen nicht mit einem Label beginnt, wird lediglich vor dem Befehl jmp die laufende Zeilennummer 2 bzw. vor dem Befehl stp die Zeilennummer 3 mit einem Doppelpunkt hinzugefügt:
2: jmp xminus1 3: stp
4. Zeile: Der Label-Bezeichner xminus1 am Zeilenanfang wird durch die aktuelle Zeilennummer, also den Wert 4 ersetzt. Außerdem wird anschließend auch in der 2. Zeile hinter jmp die Zeichenkette xminus1 durch den Wert 4 ersetzt.
2: jmp 4 4: dec x
5. Zeile: Die laufende Zeilennummer 5 und ein Doppelpunkt werden eingefügt:
5: jmp 1
6. Zeile: Da vor dem Doppelpunkt der Variablenname x steht, wird das x durch den Wert 6 ersetzt. Anschließend wird auch in den Zeilen 1 und 4 der Variablenname x durch den Wert 6 ersetzt:
1: isz 6 4: dec 6 6: 3
Insgesamt ist durch das Assembler-Übersetzungsverfahren also schließlich wieder das KHC-Maschinenprogramm Beispiel 2 "Von x auf 0" entstanden:
1: isz 6 2: jmp 4 3: stp 4: dec 6 5: jmp 1 6: 3
Wenn du mit Assembler noch ein wenig vertrauter werden möchtest, kannst du die bisherigen Maschinenprogramme noch einmal nachträglich in Assemblersprache schreiben. Unten findest du die Lösungen dazu. Bei den etwas komplexeren Programmieraufgaben im nächsten Kapitel bietet es sich an, die Lösung erst in Assemblersprache zu entwerfen und dieses anschließend in das entsprechende Maschinenprogramm zu übersetzen.
start: isz x
jmp xminus1
stp
xminus1: dec x
isz y
jmp yminus1
jmp yplus1
yminus1: dec y
jmp start
yplus1: inc y
jmp start
x: 5
y: 0
start: isz x
jmp xnicht0
jmp xgleich0
xnicht0: isz y
jmp xundynicht0
jmp fertig
xgleich0: isz y
jmp fertig
jmp xundysind0
xundynicht0: dec x
dec y
jmp start
xundysind0: inc z
fertig: stp
x: 5
y: 3
z: 0
