Navigation überspringen

ARES


Seiteninhalt:

Redcode-94 Referenz

../under_construction.gif
Die Angaben auf dieser Seite entstammen
dem veralteten ICWS-94 Draft V3.2
und bedürfen einer Überarbeitung.
Das Betrifft die Befehle JMN, DJN, DIV
und MOD, wenn sie mit den Modifiern
.F/.X/.I verwendet werden.
Diese Seite ist zum Nachschlagen gedacht. Detailliertere Erklärungen für Einsteiger sind ebenfalls verfügbar: Quelldateien, Adressierungsarten, Opcode Modifiers, Ausdrücke, Pseudo-Instruktionen, Direktiven

Redcode nach ICWS-94

Adress Modes

# Immediate (Unmittelbar)
$ Direct (Relativ)
@, * Indirect
<, { Predecrement Indirect
>, } Postincrement Indirect

Opcode Modifiers

.A A-value von beiden adressierten Zellen wird verwendet
.B B-value von beiden adressierten Zellen wird verwendet
.AB A-value der Zelle, die vom ersten Operanden adressiert wird, und B-value der vom zweiten Operanden adressierten Zelle wird verwendet
.BA B-value der Zelle, die vom ersten Operanden adressiert wird, und A-value der vom zweiten Operanden adressierten Zelle wird verwendet
.F Beide values der adressierten Zelle werden verwendet, quasi .A und .B zugleich
.X Beide values der adressierten Zelle werden verwendet, allerdings vertauscht. Quasi .AB und .BA zugleich
.I Die gesamte Instruktion wird verwendet

Opcodes

DAT wird verwendet, um Daten zu speichern
MOV Kopiert Daten oder ganze Instruktionen
ADD Addiert zwei Werte
SUB Subtrahiert zwei Wertw
MUL Multipliziert zwei Werte
DIV Dividiert einen Wert durch einen anderen
MOD Berechnet den Rest einer Division
JMP Unbedingter Programmsprung
JMZ Programmsprung, wenn ein Wert Null ist
JMN Programmsprung, wenn ein Wert nicht-Null ist
DJN Dekrementiert den Wert, und springt, falls er dann Null ist
CMP Bedingter Sprung, wenn zwei Werte gleich sind
SLT Bedingter Sprung, wenn ein Wert kleiner ist als der andere
SPL Erzeugt neuen Eintrag in der Task Queue

Grundlegende Definitionen

Eine Instruktion besteht aus opcode, einem opcode modifier, dem A-operand and dem B-operand.
A-operand besteht aus A-mode und A-number.
A-mode ist die Adressierungsart des A-operand.
A-number ist eine Ganzzahl von 0 bis CORESIZE-1.
B-Operand besteht aus B-mode und B-number.
B-mode ist die Adressierungsart des B-operand.
B-number ist eine Ganzzahl von 0 und CORESIZE-1.

Spezifische Definitionen

Der program counter (PC) ist der Pointer auf die Zelle im Core, deren Instruktion vom Core kopiert wurde, um sie auszuführen.
Die current instruction ist diese Instruktion als Kopie im instruction register des MARS-Prozessors.
Der A-pointer ist ein Zeiger auf die Zelle im Core, die der A-operand der aktuellen Instruktion referenziert.
Die A-instruction ist eine Kopie jener Instruktion im Core, auf die A-pointer zeigt. (Die Kopie wird vor der Durchführung der aktuellen Instruktion erzeugt)
Der A-value ist die A-number und/oder B-number der A-instruction, oder die A-instruction selbst, je nach opcode modifier.
Der B-pointer ist ein Zeiger auf die Zelle im Core, die der B-operand der aktuellen Instruktion referenziert.
Die B-instruction ist eine Kopie jener Instruktion im Core, auf die B-pointer zeigt. (Die Kopie wird vor der Durchführung der aktuellen Instruktion erzeugt)
Die B-value ist die A-number und/oder B-number der B-instruction, oder die B-instruction selbst, je nach opcode modifier.
Das B-target ist die A-number und/oder B-number der Instruktion, auf die B-pointer zeigt, oder die Instruktion selbst, je nach opcode modifier.

Alle MARS-Instruktionen werden nach folgendem Schema ausgeführt:

  1. Der oberste instruction pointer der Task Queue des aktuellen Warriors wird von der Queue extrahiert (entfernt) und im Register program counter gespeichert.
  2. Die entsprechende Zelle des Core wird in das current instruction-Register kopiert.
  3. Der A-operand wird ausgewertet.
  4. Die Ergebnisse der Auswertung des A-operand, der A-pointer und die A-instruction werden in den entsprechenden Registern abgelegt.
  5. Der B-operand der aktuellen Instruktion wird ausgewertet.
  6. Die Ergebnisse dieser Auswertung werden in die Register B-pointer und B-instruktion gespeichert.
  7. Die Operation wird durchgeführt, jenach opcode modifier im Register current instruction. Mit Ausnahme der DAT-Instruktion wird ein aktualisierter instruction pointer dem Ende der Task Queue hinzugefügt. (Wie der IP aktualisiert wird, hängt von der Ausführung der Instruktion ab)
Alle Pointer sind relativ zum PC (IP der aktuellen Instruktion). Sie stellen einen Offset zu der Speicherzelle des Core dar, in der sich die current instruction im Core befindet. Alle arithmetischen Operationen werden modulo CORESIZE gerechnet, wobei negative Werte von CORESIZE abgezogen werden. Des Weiteren werden alle Lesezugriffe modulo READLIMIT und alle Schreibzugriffe modulo WRITELIMIT durchgeführt.

Adress Modes

Immediate #

Ein immediate mode operand dient eigentlich nur dem Speichern von Werten. Eine immediate A/B-mode setzt die A/B-pointer auf Null.

Direct (PC-Relative) $

Ein direct mode operand wird als Offset zum Program Counter verwendet. Eine direct A/B-mode in der current instruction bedeutet, daß A/B-pointer eine Kopie des Offset sind, also die A/B-number von current instruction. Die angesprochene Adresse ist also PC + A/B-number.

Indirect *, @

Ein indirect mode operand bedeutet, daß die adressierte Zelle indirekt ermittelt werden soll. B-value von der angesprochenen Zelle wird als sekundärer Offset verwendet, das Ziel einer indirekten Adressierung ist von der angegeben Zelle so weit entfernt, wie durch den B-value jener Zelle, die durch den primären Offset beschrieben wurde. Die angesprochene Adresse ist PC + A/B-number + B-value.

Wird als adress mode ein Stern "*" angegeben, dann wird A-value als sekundärer Offset verwendet, im ICWS-94 ist aber nur der adress mode "@" definiert. Bei * ist die angesprochene Zelle dann PC + A/B-number + A-value.

Predecrement Indirect <, {

Ein predecrement indirect mode operand bewirkt eine indirekte Berechnung der Adresse der gewählten Zelle. B-value wird dekrementiert, und als sekundärer Offset verwendet. Die Adresse der angesprochenen Zelle ist also PC + A/B-number + B-value - 1.

Wird als adress mode eine öffnende geschwungene Klammer angegeben, dann wird A-value als sekundärer Offset verwendet, die Adresse ist dann PC + (A/B-number - 1) + A-value.

Postincrement Indirect >, }

Ein postincrement indirect mode operand bewirkt eine indirekte Berechnung der Adresse der gewählten Zelle. B-value der angegeben Zelle wird als sekundärer Offset verwendet, danach wird B-value inkrementiert. Die Adresse der angesprochenen Zelle ist PC + A/B-number + B-value.

Wird als adress mode eine schließende geschwungene Klammer angegeben, dann wird A-value als sekundärer Offset verwendet, die Adresse ist dann PC + A/B-number + A-value.

Opcode Modifiers

.A

Vor Ausführung der Instruktion werden A-value auf den Wert der A-number der Instruktion im Register A-instruction und B-value auf den Wert der A-number vom B-instruction-Register gesetzt. Eine Schreiboperation in den Core ersetzt die A-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.A A-number der A-instruction mit A-number der B-instruction vergleichen. Ein MOV.A würde die A-number der Zelle, auf die B-pointer zeigt, mit dem Wert A-number der A-instruction ersetzen.

.B

Vor Ausführung der Instruktion werden A-value auf den Wert B-number der A-instruction und B-value auf den Wert B-number der B-instruction gesetzt. Eine Schreiboperation in den Core ersetzt die B-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktino CMP.B die B-number der A-instruction mit B-number der B-instruction vergleichen. Ein MOV.B würde die B-number der Zelle im Core, auf die B-pointer zeigt, mit der B-number der A-instruction ersetzen.

.AB

Vor Ausführung der Instruktion werden A-value auf den Wert von A-number der A-instruction und B-value auf den Wert B-number der B-instruction gesetzt. Schreiboperationen in den Core ersetzen die B-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.AB die A-number der A-instruction mit der B-number der B-instruction vergleichen. Ein MOV.AB würde die B-number der Instruktion, auf die B-pointer zeigt mit dem Wert von A-number der A-instruction ersetzen.

.BA

Vor Ausführung der Instruktion werden A-value auf die B-number der A-instruction und B-value auf die A-number der B-instruction gesetzt. Schreiboperationen in den Core ersetzen die A-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.BA die B-number der A-instruction mit der A-number der B-instruction vergleichen. Ein MOV.BA würde die A-number der Instruktion, auf die B-pointer zeigt, mit dem Wert B-number der A-instruction ersetzen.

.F

Für die Ausführung der Instruktion wird A-value zuerst auf A-number und dann auf B-number der A-instruction gesetzt, B-value wird erst auf A-number und dann auf B-number gesetzt. Schreiboperationen ersetzen zuerst A-number und dann B-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.F die A-number der A-instruction mit der A-number der B-instruction vergleichen und dann B-number der A-instruction mit B-number der B-instruction. MOV.F würde die A-number der Instruktion, auf die B-pointer zeigt, mit der A-number der A-instruction sowie die B-number der Instruktion, auf die B-pointer zeigt, mit B-number der A-instruction ersetzen.

.X

Für die Ausführung der Instruktion wird A-value zuerst auf A-number und dann auf B-number der A-instruction gesetzt, B-value wird erst auf B-number und dann auf A-number gesetzt. Schreiboperationen ersetzen zuerst B-number und dann A-number der Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.X die A-number der A-instruction mit der B-number der B-instruction vergleichen und dann B-number der A-instruction mit A-number der B-instruction. MOV.X würde die B-number der Instruktion, auf die B-pointer zeigt, mit der A-number der A-instruction sowie die A-number der Instruktion, auf die B-pointer zeigt, mit B-number der A-instruction ersetzen.

.I

Vor Ausführung der Instruktion wird die A-instruction in A-value und die B-instricion in B-value kopiert. Schreibzugriffe auf den Core ersetzen die gesamte Instruktion, auf die B-pointer zeigt.

So würde die Instruktion CMP.I die A-instruction mit der B-instruction vergleichen. MOV.I würde die Instruktion, auf die B-pointer zeigt durch A-instruction ersetzen.

Opcodes

DAT

Nach der evaluierung der Operanden findet keine weitere Verarbeitung statt. Dadurch wird der aktuelle Task von der Task Queue des aktuellen Warriors entfernt.

MOV

MOV ersetz das B-target mit A-value und hängt die nächste Instruktion (PC + 1) an die Task Queue an.

ADD

ADD ersetzt das B-target mit der Summe von A-value und B-value (A-value + B-value) und hängt die nächste Instruktion (PC + 1) an die Task Queue an. ADD.I funkioniert genauso, wie ADD.F funktionieren würde.

SUB

SUB ersetzt das B-target mit der Differenz von B-value und A-value (B-value + A-value) und hängt die nächste Instruktion (PC + 1) an die Task Queue an. SUB.I funkioniert genauso, wie SUB.F funktionieren würde.

MUL

MUL ersetzt das B-target mit dem Produkt von A-value und B-value (A-value * B-value) und hängt die nächste Instruktion (PC + 1) an die Task Queue an. MUL.I funkioniert genauso, wie MUL.F funktionieren würde.

DIV

DIV ersetzt das B-target mit dem ganzzahligen Ergebnis der Division von A-value durch B-value (A-value / B-value) und hängt die nächste Instruktion (PC + 1) an die Task Queue an. DIV.I funkioniert genauso, wie DIV.F funktionieren würde. Falls A-value Null ist, bleibt B-value unverändert und der aktuelle Task bleibt von der Task Queue entfernt.

MOD

DIV ersetzt das B-target mit dem Rest der Division von A-value durch B-value (A-value % B-value) und hängt die nächste Instruktion (PC + 1) an die Task Queue an. MOD.I funkioniert genauso, wie MOD.F funktionieren würde. Falls A-value Null ist, bleibt B-value unverändert und der aktuelle Task bleibt von der Task Queue entfernt.

JMP

JMP fügt die Summe von program counter und A-pointer der Task Queue hinzu.

JMZ

Wenn B-value Null ist, wird die Summe von program counter und A-pointer, andernfalls program counter + 1 der Task Queue hinzugefügt. JMZ.I funktioniert, wie JMZ.F funktionieren würde. So würde der Sprung ausgeführt, wenn A-number sowie B-number der B-instruction Null sind.

JMN

Wenn B-value nicht Null ist, wird die Summe von program counter und A-pointer, andernfalls program counter + 1 der Task Queue hinzugefügt. JMN.I funktioniert, wie JMN.F funktionieren würde. So würde der Sprung ausgeführt, wenn A-number sowie B-number der B-instruction nicht Null sind. Dies ist nicht die Umkehrung von JMZ.F!

Achtung: pmars behandelt JMN.F anders; der Sprung erfolgt auch, wenn nur einer der beiden Werte A-number oder B-number ungleich Null ist!

DJN

Dekrementiert B-value des B-target und prüft dann auf Null. Wenn der dekrementierte B-value nicht Null ist, wird die Summe von program counter und A-pointer, andernfalls program counter + 1 der Task Queue hinzugefügt. DJN.I funktioniert, wie DJN.F funktionieren würde. So würden A-number sowie B-number von B-value und B-target dekrementiert und dann der Sprung ausgeführt, wenn A-number sowie B-number der B-instruction nicht Null sind.

Achtung: pmars behandelt DJN.F anders; der Sprung erfolgt auch, wenn nur einer der beiden Werte A-number oder B-number ungleich Null ist!

CMP

CMP verlgleicht A-value mit B-value. Wenn beide Werte gleich waren, wird die übernächste Instruktion (PC + 2) der Task Queue hinzugefügt (Die nächste Instruktion wird übersprungen). War das Ergebnis ungleich, wird die nächste Instruktion (PC + 1) der Task Queue hinzugefügt.

SLT

SLT vergleicht A-value mit B-value. Wenn A-value kleiner als B-value ist, wird die übernächste Instruktion (PC + 2) der Task Queue hinzugefügt (Die nächste Instruktion wird übersprungen). Andernfalls wird die nächste Instruktion (PC + 1) der Task Queue hinzugefügt. SLT.I funktioniert wie SLT.F.

SPL

SPL fügt die nächste Instruktion (PC + 1) der Task Queue hinzu. Wenn die Queue noch nicht voll ist, wird auch noch die Summe von program counter und A-pointer der Task Queue hinzugefügt.

Content Management:

μCMS α1.6