Lernpfad Know-How-Computer/Know-How-Assembler: Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung Markierung: Quelltext-Bearbeitung 2017 |
KKeine Bearbeitungszusammenfassung Markierung: Quelltext-Bearbeitung 2017 |
||
| (8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
__NOTOC__ | __NOTOC__ | ||
{{Fortsetzung| | {{Fortsetzung| | ||
vorher=zurück|vorherlink= | vorher=zurück|vorherlink=Lernpfad_Know-How-Computer/KHC Programmieraufgaben Teil 1| | ||
weiter=weiter|weiterlink= | weiter=weiter|weiterlink=Lernpfad_Know-How-Computer/KHC Programmieraufgaben Teil 2| | ||
übersicht=Startseite|übersichtlink= | übersicht=Startseite|übersichtlink=Lernpfad_Know-How-Computer}} | ||
{{Box|Assembler macht das Programmieren leichter|Vielleicht ist dir beim Bearbeiten der Programmieraufgaben schon aufgefallen, dass es bei längeren Maschinenprogrammen schwierig werden kann, den Überblick zu behalten ( | {{Box|Assembler macht das Programmieren leichter|Vielleicht ist dir beim Bearbeiten der Programmieraufgaben schon aufgefallen, dass es bei längeren Maschinenprogrammen schwierig werden kann, den Überblick zu behalten (Was passiert noch mal ab Sprungadresse 8?). Außerdem kann es ziemlich lästig werden, wenn man nachträglich noch Befehlszeilen einfügen, ändern oder umstellen will, weil anschließend wegen der fortlaufenden Zeilennummerierung viele weitere Adressen geändert werden müssen. Hier ist die Einführung der so genannten Assemblersprache nützlich.|Lernpfad}} | ||
===Assembler - was ist das? === | ===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 | 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 | 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=== | ===Von der Maschinensprache zur Assemblersprache=== | ||
Wie so ein Assembler-Programm aussieht, soll am Beispiel des bereits bekannten Programms | 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==== | ||
<pre>1: isz 6 | <pre>1: isz 6 | ||
2: jmp 4 | 2: jmp 4 | ||
| Zeile 21: | Zeile 21: | ||
6: 3</pre> | 6: 3</pre> | ||
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 | 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: | 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==== | ||
<pre> | <pre> | ||
start: isz x | start: isz x | ||
| Zeile 33: | Zeile 33: | ||
x: 3 | x: 3 | ||
</pre> | </pre> | ||
=== Von der Assemblersprache zur Maschinensprache === | === 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: | 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: | ||
{{Box|Das Assembler-Übersetzungsverfahren|Die Zeilen des KHA-Programms werden Schritt für Schritt der Reihe nach durchnummeriert mit 1, 2, 3 usw. Stößt man dabei auf eine Zeile, die mit einem Label wie z.B | {{Box|Das Assembler-Übersetzungsverfahren|Die Zeilen des KHA-Programms werden Schritt für Schritt der Reihe nach durchnummeriert mit 1, 2, 3 usw. Stößt man dabei auf eine Zeile, die mit einem Label wie z.B start: beginnt, dann wird der Name des Labels durch die aktuelle Zeilennummer ersetzt und auch im gesamten übrigen Assembler-Programm wird diese Ersetzung durchgeführt. In Zeilen, die nicht mit einem Label beginnen, wird lediglich am Zeilenanfang die Nummer der Zeile mit einem Doppelpunkt eingefügt.|Merksatz}} | ||
Bei unserem Programm | 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 | '''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: | ||
<pre> | <pre> | ||
1: isz x | 1: isz x | ||
| Zeile 54: | Zeile 52: | ||
3: stp </pre> | 3: stp </pre> | ||
{{Box|1=Aufgabe | {{Box|1=Aufgabe "Von x auf 0" in Assembler|2=Übersetze auch die restlichen drei Zeilen des Assemblerprogramms "Von x auf 0" schrittweise in die Maschinensprache. Schreibe die einzelnen Übersetzungsschritte auf wie oben im Beispiel.|3=Üben}} | ||
{{Lösung versteckt|1='''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. | {{Lösung versteckt|1='''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. | ||
| Zeile 71: | Zeile 69: | ||
6: 3</pre> | 6: 3</pre> | ||
Insgesamt ist durch das Assembler-Übersetzungsverfahren also schließlich wieder das KHC-Maschinenprogramm Beispiel 2 | Insgesamt ist durch das Assembler-Übersetzungsverfahren also schließlich wieder das KHC-Maschinenprogramm Beispiel 2 "Von x auf 0" entstanden: | ||
<pre> | <pre> | ||
1: isz 6 | 1: isz 6 | ||
| Zeile 83: | Zeile 81: | ||
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. | 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. | ||
{{Box|1=Aufgabe | {{Box|1=Aufgabe "Ist x ungerade?" in Assembler|2=Schreibe ein Programm zu der Aufgabe "Ist x ungerade?" in Assemblersprache.|3=Üben}} | ||
{{Lösung versteckt|1= | {{Lösung versteckt|1= | ||
<pre> | <pre> | ||
start: isz x | start: isz x | ||
jmp | jmp xminus1 | ||
stp | stp | ||
xminus1: dec x | xminus1: dec x | ||
isz y | isz y | ||
jmp | jmp yminus1 | ||
jmp | jmp yplus1 | ||
yminus1: dec y | yminus1: dec y | ||
jmp start | jmp start | ||
| Zeile 103: | Zeile 101: | ||
|2=Lösung anzeigen|3=Lösung verstecken}} | |2=Lösung anzeigen|3=Lösung verstecken}} | ||
{{Box|1=Aufgabe | {{Box|1=Aufgabe "Ist x = y?" in Assembler|2=Schreibe ein Programm zu der Aufgabe "Ist x = y?" in Assemblersprache.|3=Üben}} | ||
{{Lösung versteckt|1= | {{Lösung versteckt|1= | ||
<pre> | <pre> | ||
start: | 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 | |||
fertig: | |||
x: 5 | x: 5 | ||
y: 3 | y: 3 | ||
| Zeile 129: | Zeile 124: | ||
</pre> | </pre> | ||
|2=Lösung anzeigen|3=Lösung verstecken}} | |2=Lösung anzeigen|3=Lösung verstecken}} | ||
{{Fortsetzung| | {{Fortsetzung| | ||
vorher=zurück|vorherlink= | vorher=zurück|vorherlink=Lernpfad_Know-How-Computer/KHC Programmieraufgaben Teil 1| | ||
weiter=weiter|weiterlink= | weiter=weiter|weiterlink=Lernpfad_Know-How-Computer/KHC Programmieraufgaben Teil 2| | ||
übersicht=Startseite|übersichtlink= | übersicht=Startseite|übersichtlink=Lernpfad_Know-How-Computer}} | ||
[[Kategorie:Know-How-Computer]] | |||
Aktuelle Version vom 30. Juli 2025, 19:23 Uhr
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
