Nachricht für neue Nutzer.
Nachricht für engagierte Nutzer.

Lernpfad Know-How-Computer/Know-How-Assembler: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
KKeine Bearbeitungszusammenfassung
Markierung: Quelltext-Bearbeitung 2017
KKeine Bearbeitungszusammenfassung
Markierung: Quelltext-Bearbeitung 2017
Zeile 93: Zeile 93:
         isz y        ; y=0?  
         isz y        ; y=0?  
         jmp yminus1  ; nein: weiter bei yminus1
         jmp yminus1  ; nein: weiter bei yminus1
jmp yplus1  ; ja: weiter bei yplus1
        jmp yplus1  ; ja: weiter bei yplus1
yminus1: dec y
yminus1: dec y
         jmp start
         jmp start

Version vom 13. Juni 2025, 18:44 Uhr

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 wegen der fortlaufenden Zeilennummerierung viele Adressen geändert werden müssen. Hier ist die Einführung der so genannten Assemblersprache nützlich.

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

Hinweis
Weitere Beispiele für Programme in Know-How-Assemblersprache findet man im Lösungsteil zu den Übungsaufgaben.

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:

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.

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 

Aufgabe „Von x auf 0“ in Assembler
Ü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.

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.

Aufgabe „Ist x ungerade?” in Assembler
Schreibe ein Programm zu der Aufgabe „Ist x ungerade?” in Assemblersprache.
start:   isz x        ; x=0?
         jmp xminus1  ; nein: weiter bei xminus1
         stp          ; ja:   fertig
xminus1: dec x
         isz y        ; y=0? 
         jmp yminus1  ; nein: weiter bei yminus1
         jmp yplus1   ; ja: weiter bei yplus1
yminus1: dec y
         jmp start
yplus1:  inc y        
         jmp start
x:       5
y:       0

Aufgabe „Ist x = y?” in Assembler
Schreibe ein Programm zu der Aufgabe „Ist x = y?” in Assemblersprache.
start:          isz x ; Ist x=0 ?
                jmp xistungleich0  ; nein: dann y überprüfen ab Marke xistungleich0
                jmp xistgleich0    ; ja:   dann y überprüfen ab Marke xistgleich0
xistungleich0:  isz y              ; Hier ist x!=0. Ist zusätzlich y=0?
                jmp xundyungleich0 ; nein: dann ist x!=0 und y!=0, also ab Marke xundyungleich0 
                                   ;       beide verringern und dann Schleife wiederholen
                jmp fertig         ; ja:   dann ist x!=0 und y=0, also fertig in Marke fertig
xistgleich0:    isz y              ; Hier ist x=0. Ist zusätzlich y=0?
                jmp fertig         ; nein: dann ist x=0 und y!=0, also fertig in Marke fertig
                jmp xundygleich0   ; ja: dann ist x=0 und y=0, also z=1 in Marke xundygleich0 
                                   ; und dann fertig
xundyungleich0: dec x              ; Hier ist x!=0 und y!=0. Daher werden x und y verringert 
                                   ; und dann die Schleife wiederholt 
                dec y  
                jmp start          ; zurück zum Schleifenanfang in Marke start
xundygleich0:   inc z              ; im Fall x=0 und y=0 erhöhe z von 0 auf 1 und fertig
fertig:         stp    	           ; fertig 
x: 5
y: 3
z: 0