Die Maschinensprache besteht aus einer Folge von
Bits. Da dies praktisch unlesbar ist,
wird jede zulässige Bitfolge mit einem oder mehreren Namen – den sogenannten Mnemoniks – und evtl. Zahlen dargestellt. Ein
Assembler übersetzt nach der Programmerstellung die Mnemoniks nahezu eins zu eins in die Maschinensprache.
;Beispiel: Befehl:
Lade Register A, Mnemonik:
LDA, Maschinencode beziehungsweise
Opcode:
00110101
- x86-Befehl: MSDOS-Softwareinterrupt 21, Mnemonik: INT 21, Maschinencode: 1100110100100001 (hexadezimal 0xCD21)
Überblick über die typische Funktionalität einer Maschinensprache
Die Maschinensprache enthält die direkt vom Prozessor verstandenen Befehle. Damit ein Computer numerische Probleme lösen kann, muss ihm der Lösungsweg in einer ihm verständlichen Art und Weise mitgeteilt werden. Das
Programmiermodell eines Prozessors beschreibt die für die Programmierung relevanten
Hardware-Details. Typischerweise hat ein Prozessor eine zumeist kleine Zahl interner
Register, die zur kurzzeitigen Zwischenspeicherung von Rechenoperanden und Ergebnissen benutzt werden. Der Prozessor kann über den Adressbus und
Datenbus seinen angeschlossenen
Hauptspeicher, sowie Schnittstellen zu externen Geräten ansprechen. Manche Architekturen verfügen nicht über Register, die Datenverarbeitung läuft in diesen Fällen in einem
Stapel-, einem Variablen-Kontext und dem Hauptspeicher ab.
Grundlegende Maschinen-Befehle lassen sich in folgende Kategorien unterteilen:
- Arithmetische Operationen: Führen Berechnungen durch
- Logische Operationen: Verknüpfen Bitfelder logisch miteinander (AND, OR, XOR, NOT)
- Bit-orientierte Operationen: Mit ihnen kann man einzelne Bits in einem Bitfeld genau anprechen und manipulieren
- Speicheroperationen: Übertragen Daten zwischen Prozessorregistern und Speicher
- Vergleichsoperationen: Vergleich von Werten
- Steueroperationen: Verzweigungen, die den Ablauf des Programms beeinflussen
In vielen modernen Prozessoren sind die Befehle der Maschinensprache, zumindest die komplexeren unter ihnen, intern durch Mikroprogramme realisiert. Das ist insbesondere bei der sogenannten
CISC-Architektur der Fall.
Programmerstellung
Intern ist jeder Befehl der Maschinensprache durch ein oder mehrere Zahlenwerte kodiert. Diese Zahlenwerte bestehen aus dem
Opcode, der die Art des Befehls festlegt, eventuell gefolgt von einem oder mehreren Bytes an Daten zu diesem Befehl. Eine sinnvolle Folge von solchen Zahlencodes im Hauptspeicher bzw. als Datei gespeichert bildet demnach ein Programm. Es gibt nun verschiedene Arten, solche Programme zu erstellen:
- Direkte Eingabe der Binärcodes über eine Reihe von Schaltern (äußerst kryptisch und unpraktisch, seit den 1970er Jahren völlig außer Gebrauch gekommen)
- Über einen Hex-Editor den Zahlen-Code in Hexadezimalzahlen schreiben. (immer noch sehr kryptisch und unpraktisch)
- Mit einem Assembler: Assemblersprachen formulieren die Prozessorbefehle des Maschinencodes als Mnemonics in einer einfachen, relativ leicht lesbaren Syntax. Dieser Quelltext wird danach vom Assembler in den Maschinencode konvertiert.
- Ein Programm wird in einer relativ abstrakten Hochsprache geschrieben, danach von einem Compiler in Maschinencode übersetzt (kompiliert).
- Alternativ können Programme in einer Hochsprache auch – entweder nach Kompilierung in einen Zwischencode oder direkt – durch einen Interpreter abgearbeitet werden.
Ein Beispiel hierfür ist die Programmiersprache
Java, dessen Zwischencode (auch
Bytecode genannt) von einem Interpreter ausgeführt wird. Dies geschieht für den Benutzer transparent, wenn z. B. ein Applet im Internet Browser ausgeführt wird. Neben Java werden auch sämtliche .NET Sprachen, wie beispielsweise
C# in einen Zwischencode (engl. Intermediate Language) übersetzt, welcher anschließend zur Laufzeit innerhalb der
CLR von einem
JIT-Compiler in die entsprechende Maschinensprache übersetzt wird.
Geschichte
Obwohl es bis in die 50er Jahre hinein noch keine Compiler gab, wurden Programme durchaus schon in Hochsprachen entworfen, mussten dann aber manuell in Maschinensprache übersetzt werden.
Literatur
- Reiner Backer: Assembler – Maschinennahes Programmieren von Anfang an; rororo Taschenbücher Nr. 61224; (2003); ISBN 3-499-61224-0
Siehe auch