Assembler
Zunächst muss man unterscheiden zwischen Assembler und Assemblersprache. Beim Assembler spricht man von einem Computerprogramm, das die Assemblersprache in eine für Maschinen verständliche Maschinensprache übersetzt. Die Assemblersprache wird von Entwicklern verwendet, um die Programme für Maschinen zu schreiben. In der Praxis wird oft von Assembler gesprochen, wenn eigentlich die Assemblersprache gemeint ist.
Assembler bzw. die Assemblersprache wird dazu benötigt, um direkt auf Mikroprozessorebene zu programmieren. Das heisst, es wird kein Betriebssystem, Compiler, Interpreter etc. benötigt (was bei höheren Programmiersprachen der Fall ist), um Befehle ausführen zu können. Beispielsweise werden Ampeln mit Mikroprozessoren und folglich auch mit Assembler betrieben.
Die Assemblersprache unterscheidet sich von der Maschinensprache insofern, als die Befehle hier immer noch in einer verständlichen Textform und nicht etwa in einer binären Schreibweise dargestellt werden. Die Assemblersprache gilt als Programmiersprache der zweiten Generation, da sie Nachfolger der direkten Programmierung mit Zahlencodes ist. Die Übersetzung mittels Assembler von Assemblersprache in Maschinensprache ist 1:1. Die Assemblersprache wird im Alltag häufig fälschlicherweise auch als Maschinensprache bezeichnet.
Programme, die mit einer Assemblersprache geschrieben sind, zeichnen sich dadurch aus, dass alle Verarbeitungsmöglichkeiten des Mikroprozessors genutzt werden. Weiterhin können solche Programme auch Hardwarekomponenten direkt ansteuern. Die Nutzung von Assemblersprachen ist heutzutage kaum mehr erforderlich, da auch die höheren Programmiersprachen sehr hardwarenah eingesetzt werden können. Je nach System macht es aber durchaus Sinn, Assembler zu verwenden. Beispielsweise bei zeitkritischen oder sehr hardwarenahen Programmen oder auch falls für die Programme nicht sehr viel Speicherplatz zur Verfügung steht. Ältere technische Anlagen werden noch häufig damit gesteuert.
Da jede Computerarchitektur unterschiedlich ist, hat auch jede Computerarchitektur ihre eigene Assemblersprache. Sie unterscheiden sich in Anzahl und Typ der Operationen.
Die grundlegenden Operationen sind bei allen alle Assemblersprachen gleich:
- Daten lesen & schreiben aus/in den Prozessor von/nach Hauptspeicher
- einfachste logische Operationen - AND/OR/NOT/SHIFT
- einfache Kontrolle des Programmflusses (durch Flags -> Sprünge, Overflow etc.)
- einfache arithmetische Operationen (Additionen, Vergleiche etc.)
Bei Steuerungsaufgaben wird nach dem EVA-Prinzip gearbeitet, Eingabe, Verarbeitung, Ausgabe.
Konkreter bedeutet dies, dass ein Sensor, für die Eingabe, ein Prozessor zur Verarbeitung, und ein Aktor für die Ausgabe verwendet werden.
Ein einfaches Beispiel kann etwa der Taschenrechner sein. Als Eingabe wird der Tastendruck des Benutzers registriert. Der Prozessor verarbeitet diese Eingabe, indem er den entsprechenden Befehl ausführt. Zum Beispiel "Speichere die Zahl 2 und zeige sie an". Anschliessend wird der Prozessor dem Bildschirm eine 2 zurückgeben, die er anzeigen soll.
Programmierung mit Assembler
Der wohl am häufigsten genutzte Befehl in der Assemblersprache ist der mov-Befehl. Er wird verwende um den Wert des einen Operanden in den anderen Operanden zu kopieren. Der mov-Befehl sieht folgendermassen aus:
mov op1, op2
"op1" und "op2" stellen die Operanden dar und haben je nach System einen anderen Namen. Bei diesem Befehl wird der erste Operand auch als Zieloperand bezeichnet und der zweite als Quelloperand. Da der Wert kopiert wird, müssen auch beide Operanden derselben Grösse entsprechen. Hat der Quelloperand 8 Bit, so muss auch der Zieloperand 8 Bit gross sein.
Ein weiterer oft benutzter Befehl ist der xchg-Befehl. Dieser wird gebraucht, um die Werte der angegebenen Operanden zu vertauschen. Die Syntax ist gleich dem vorherigen Befehlt und sieht folgendermassen aus:
xchg op1, op2
Um einen besseren Einblick darüber zu erhalten, was es alles für Register, Flags, Pointer etc. gibt, ist nachfolgend ein Teil des Debuggers vom Assembler abgebildet.
Hier sind alle Register etc., die ein Assemblersystem verwendet, aufgelistet. Die erste Zeile stellt das Daten- sowie Stackregister dar. Je nach Aufruf unterscheidet sich der Inhalt der Register. Ausnahme ist das BX-Register, welches immer auf null gestellt ist. Das CX-Register gibt die Grösse des Programmcodes an.
Die nächste Zeile zeigt die Segmentregister an. Diese beinhalten Daten wie Programmcode, konstante Daten etc. Das IP-Segment (Instruction Pointer) zeigt an, an welcher Stelle sich das Programm im Code befindet. Dahinter kommen verschiedene Flags, Overflow Flag, Sign Flag, Interrupt Flag, Zero Flag etc.
In der letzten Zeile sieht man links zuerst die Adresse des Befehls und danach, welcher Befehl als nächstes folgt.
In diesem Beispiel sieht man, dass als Befehl "mov AX, 5522" folgen wird. Das Ergebnis sieht dann folgendermassen aus:
Man kann nun sehen, dass das Register AX, oben links, nun den Wert 5522 angenommen hat. Man kann mit der Assemblersprache natürlich viel umfangreichere Programme erstellen, z.B. auch ein klassisches "Hello World". Dazu werden natürlich entsprechende Ausgabegeräte gebraucht (z.B. Monitor).
Keine Kommentare:
Kommentar veröffentlichen