Cheat-Praxis: Grundlagen


Befehlscode und Programm

Jedes der unzähligen Bytes, die ein Hex-Editor auflistet, gehört zu einer der folgenden drei Gruppen:

  • Befehl
  • Datum
  • Adresse

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
von Ren Meyer