Jedes der unzähligen Bytes, die ein Hex-Editor auflistet, gehört
zu einer der folgenden drei Gruppen:
Ein Befehl ist eine Anweisung für den Prozessor. Ein Datum kann alles
Mögliche sein: ein einzelner Buchstabe, eine Zahl, ein Teil eines Namens
... Eine Adresse als Spezialform des Datums kennzeichnet eine Speicherzelle.
Diese kann eine weitere Adresse sowie Daten oder Befehle enthalten.
Alle Daten liegen in Binärform, somit als Bitketten, vor. Es ist nur
aus dem Kontext erkennbar, ob der Inhalt einer Speicherzelle nun ein Datum
oder einen Befehl enthält, da sich beide den gleichen Speicherbereich
teilen können.
Oder anders ausgedrückt, wenn dem Prozessor weisgemacht wird, ein
Speicherbereich, der Daten enthält, sei ein Programm, das er ausführen
darf, gibt es Ärger, den Sie mit dem Reset-Knopf quittieren müssen.
Befehle werden in der Regel hintereinander, sequentiell, abgearbeitet.
Sprünge, die man in bedingte und unbedingte einteilt, ändern die
Reihenfolge der Befehlsabarbeitung. Eine spezielle Prozessor-Variable, der
Programmzähler, zeigt auf den als nächstes abzuarbeitenden Befehl.
Die Abarbeitung eines Programms setzt sich aus Teilschritten zusammen, die
der Prozessor fortwährend ausführt: Als erstes wird der
Programmzähler auf den nächsten Befehl gesetzt. Dann wird der Befehl,
der sich an der Adresse befindet, eingelesen. Dort wird er von einer Bitfolge
in den internen Mikrocode übersetzt. Dieser Microcode ist die absolute
Ursprache. Auf dieser Ebene werden Befehle tatsächlich abgearbeitet,
indem das Verhalten von Transistoren beinflußt wird. Die Logik ist
dafür verantwortlich, daß tatsächlich etwas Sinnvolles passiert.
Ein typischer Befehl an den Prozessor kann so aussehen:
Addiere zu der Prozessorvariable A eine 4!
Als Bitfolge stünde der Befehl etwa so im Speicher:
1010 1011 ; als Befehl "Addiere zu A"
0000 0010 ; als Operand 4
Die ersten Programmierer mußten tagein, tagaus Nullen und Einsen eintippen,
wahrlich kein Vergnügen. Auch das Eingeben von Hexzahlen wie
23 4D E4
macht keinen sonderlichen Spaß, ganz abgesehen von der Fehlerquote
- war nun A2 Addieren mit Register A oder mit B?
Aus diesem Grund dachte man sich eine Schreibweise aus, die aus für
den Menschen einigermaßen verständlichen Kürzeln besteht,
natürlich in Englisch. Danach könnte der obengenannte Prozessor-
oder Maschinenbefehl so
add a, 4
aussehen - addiere Register A mit der Zahl 4.
Diese Kürzel nennt man Mnemonics, was soviel wie leicht einprägbar
heißt. Und das sind sie in der Tat.Die erste Programmiersprache war
geboren - Assembler, abstammend von dem englischen assemble - zusammensetzen.
Ein Assemblerbefehl ist das genaue Abbild eines Prozessorbefehls. Der Memory
Editor von X-Link für DOS kann die Bytes wahlweise als Assemblerbefehle
darstellen (F1 - Disassembler).
Hinweis: Als Assembler bezeichnet man auch den Übersetzer von
Assemblerprogrammen in Prozessorbefehle - aus add a, 4 werden ein paar Hexzahlen,
die im Speicher abgelegt werden. Das Gegenstück ist der Disassembler.
Im Laufe der Jahre entwickelte man mit Hochsprachen die Möglichkeit,
Programme viel abstrakter zu schreiben - mehr dem menschlichen Denken
angepaßt als dem Befehlssatz des Prozessors. Solche Sprachen wie BASIC,
Pascal oder C setzen sich aus Befehlen wie
while not (a = 10) do
begin
write(a);
inc(a)
end;
zusammen, die sehr leicht interpretiert werden können:
solange nicht a = 10 ist, dann
schreib a auf den bildschirm und
erhöhe a um 1
und wiederhole das ganze
Zu gut Deutsch:
Solange die Variable A nicht 10 ist, druckst Du sie aus und erhöhst
sie um eins (inc, inkrementiere).
In Hochsprachen kann man Programme viel schneller schreiben als in Assembler;
nahezu alle Spiele werden heutzutage in einer Hochsprache entwickelt. Das
Übersetzen in Maschinensprache übernimmt entweder ein Compiler
oder (seltener) ein Interpreter.
Ein Compiler zerlegt ein Programm in seine Befehlsworte und übersetzt
sie hintereinander in Maschinensprache. Dazu steht ihm eine Bibliothek zur
Verfügung, welche die Maschinenbefehle für jede einzelne
Hochsprachen-Anweisung enthält. Diese nennt man übrigens
Laufzeitbibliothek oder Runtime Library. Das Ergebnis ist dann ein
Maschinenprogramm, dem man es nicht ansieht, auf welche Weise es geboren
wurde. Aus diesem Grund ist eine 100%ige Rückwärtsübersetzung
(Re-Compiling) in eine Hochsprache nicht möglich