Einführung in Programmierung mittels Corewars und Redcode
Dieser Abschnitt erläutert allgemeine Grundlagen der EDV in Hinblick auf Core War Programmierung. Wenn du schon Erfahrungen mit Core War hast, dann brauchst du hier gar nicht weiterlesen. Wenn du Maschinensprache kennst, dann solltest du dir vielleicht den Aufbau einer MARS-CPU ansehen.
Dieses Tutorial setzt vorraus, daß du schon einmal etwas über EDV-Grundlagen gehört hast, es soll nämlich nur ganz bestimmte Aspekte der Computerei verständlich machen und vertiefen. Laß dich von den folgenden Begriffen nicht abschrecken - wenn du ein Laie bist, dann ist dieses Kapitel genau richtig für dich.
Überblick
Dieses Tutorial soll als Leitfaden für den Einstieg in das Spiel dienen. Obwohl freilich nicht alles erklärt wird, wird der Leser sozusagen an der Hand durch das rote Wunderland geführt. Der Kurs richtet sich in erster Linie an Laien, aber auch Fachpersonen werden sich hiermit nicht langweilen. Da es sich hier um eine grundlegende Einführung handelt, werden nicht alle Kniffe und Details fortgeschrittener Core War-Techniken erläutert - an den entsprechenden Stellen sind Verweise auf andere (spezifische) Turtorials angegeben.
Die Einführung erklärt, wie Computer im allgemeinen und ein MARS im speziellen funktionieren. Dabei geht es um folgende Begriffe:
Maschinensprache und Assembler
Prozessor, ALU, Register
Instruction Pointer (IP), Multitasking und Task Queue (FIFO)
Was einen MARS-Prozessor von einem echten unterscheidet
Des Weiteren werden folgende Themen behandelt:
Wie man grundlegende Programmieraufgaben löst
Wie man einfache Kampfprogramme schreibt
Ausgesuchte Profitechniken
Zuletzt wird die Sprache Redcode im Detail besprochen:
Die Verwendung der Redcode Instruktionen
Adressierung und Speicherzugriff
Möglichkeiten des Preprozessors
Text ersetzen mit EQU (Konstanten definieren)
Text ersetzen mit FOR (Bereiche wiederholen)
Direktiven (Zusätzliche Sonderbefehle, die nicht zu Redcode gehören)
Einleitung
Assemblerprogramme unterscheiden sich deutlich von Programmen, die in einer Hochsprache wie z. B. BASIC, Pascal, JavaScript oder C++ geschrieben sind. Jeder dieser Befehle einer Hochsprache ist letztlich nur ein Platzhalter für eine meist recht große Anzahl von Maschinenbefehlen. Eine spezielle Software (der Compiler) übersetzt die Befehle der Hochsprache in Maschinencode, damit das Programm ausgeführt werden kann. Wenn man z. B. einen Text am Bildschirm anzeigen lassen möchte, dann lautet der entsprechende Befehl in der Programmiersprache BASIC: PRINT "Hello, World!". Ein Programm in Maschinensprache muß dagegen zunächst vergleichsweise umständlich dafür sorgen, daß jeweils ein Zeichen nach dem anderen in den Speicher der Grafikkarte kopiert wird. Darüber hinaus wird man nicht einen MOV-Befehl für jedes einzelne Zeichen eingeben, sondern eine Automatik verwenden, die einen einzigen MOV solange wiederholt, bis das Ende der Zeichenkette erreicht ist. Wer schon Erfahrungen mit der einen oder anderen Hochsprache hast, wird sich vielleicht fragen, was Assemblerprogrammierung denn überhaupt bringt; die Antwort leuchtet sofort ein: Man kann damit Core War spielen. Ganz im Ernst: Maschinenprogramme werden von Menschen geschrieben und können dadurch besonders gut optimiert werden. Sie nutzen so die Möglichkeiten der Hardware besser, als es ein Programm tun könnte, das von einem Compiler übersetzt oder gar von einem Interpreter ausgeführt wird (z. B. JavaScript). Assemblerprogramme werden für den PC nur noch in zeitkritischen Abschnitten von Betriebsystemen, Treibern und 3D-Grafikprogrammen (Spiele, 3D-Studio) geschrieben. Moderne Hochsprachen erlauben es, Assembler-Abschnitte direkt in den Quellcode einzubinden (Inline Assembler).
Redcode Assembler
Die in diesem Kapitel gezeigten Programm(teile) können meistens nicht direkt in den Simulator eingegeben werden, denn sie beinhalten zusätzliche Angaben für den Präprozessor. Sie müssen in einer Datei gespeichert sein und werden vor Beginn einer Schlacht vom Assemblerprogramm eingelesen, übersetzt und im Core des MARS gespeichert. Teile einer Zeile, die hinter einem Strichpunkt (";") notiert werden, dienen Kommentierungszwecken - sie werden vom Assembler ignoriert. Das gilt allerdings nicht für Direktiven; das sind besondere Befehle, die als Kommentar angeschrieben werden, und den KoTH-Serverern bzw. dem ARES-Debugger zusätzliche Informationen liefern.
ARES zeigt den Inhalt des Core im "Monitor-View" normalerweise gekürzt an, da der Standard ICWS-88 nicht alle Teile des Speichers nutzte. So benutzt der Befehl JMP +1 nur einen Operanden (+1). Da aber Programme, die für ICWS-94 geschrieben werden, auch den "unsichtbaren" zweiten Operanden ansprechen dürfen, kann man mit der Tastenkombination Strg-O zwischen vollständiger und ICWS-88 konformer Ansicht umschalten. Die Beispiele in diesem Kapitel sind in '88er Schreibweise dargestellt, damit Anfänger sie besser verstehen können. Dieser Unterschied bezieht sich hauptsächlich auf die Anzeige im Monitor, man darf die Befehle im Editor in beiden Schreibweisen notieren. Der einzige Unterschied besteht darin, daß weggelassene Opcode Modifiers automatisch ergänzt werden.