Navigation überspringen

ARES


Seiteninhalt:

Pseudoinstruktionen

Pseudoinstruktionen sind Opcodes, die zwar einen Einfluß auf die Übersetzung des Programmes haben, aber selbst im fertigen Programm nicht aufscheinen. Es handelt sich um die Befehle ORG, END, EQU und FOR/ROF.

ORG und END

Mit ORG <start> und END <start> kann man festlegen, bei welcher der Instruktionen das Programm beginnt, man kann den Einstprungspunkt frei wählen. Wird eine Zahl angegeben, so ist zu beachten, daß die erste "echte" Instruktion die Nummer 0 hat.
  ORG boot 

bomb DAT $0

boot
loop MOV bomb, @ptr
ADD #4, ptr
JMP loop
ptr DAT #4
Die END-Anweisung unterschiedet sich von ORG dadurch, daß jeglicher Text danach ignoriert wird: Der Assembler liest, nachdem er eine Zeile mit END vorfindet, keine weiteren Zeilen aus der Datei mehr ein.

EQU

Diese Pseudo-Instruktion funktioniert wie eine automatische Ersetzen-Funktion. Eine EQU-Anweisung muß nach einem Labelnamen stehen. Bei der Übersetzung wird jedes Vorkommen dieses Labels durch den Text, der nach dem EQU definiert wurde, ersetzt. Hierbei können einzelne Zahlenwerte angegeben werden, wie auch ganze Instruktionen. Sogar Mehrzeilige Werte können definiert werden:
  STEPSIZE     EQU   CORESIZE/100              "Einfaches" EQU

SOME_DWARF EQU MOV bomb, @+3 Multi-Line-EQU
EQU ADD #STEPSIZE, +2
EQU JMP -2

SOME_DWARF Dwarf hier einfügen
ptr DAT #4
bomb DAT $0
Wenn die entsprechende Option eingeschaltet ist (Voreinstellung), dann werden sowohl vom ARES-Assembler, wie auch von pmars folgende EQUs automatisch definiert, mit Ausnahme von READLIMIT und WRITELIMIT, welche von pmars nicht unterstützt werden:

Vorbelegte EQU Werte
Name Bedeutung
CORESIZE Größe des Core
READLIMIT Größte relative Entfernung für Lesezugriffe
WRITELIMIT Größte relative Entfernung für Schreibzugriffe
MAXPROCESSES Größe der Task-Queue eines Spielers
MAXCYCLES Untentschieden nach Anzahl Zyklen
MAXLENGTH Maximale erlaubte Instruktionen/Warrior beim Laden
MINDISTANCE Minimaler Start-Abstand zwischen den Programmen
ROUNDS Anzahl der Runden in dieser Konfrontation
PSPACESIZE Größe des Privatspeichers
VERSION Version von PMARS 93 = pmars 0.9.3
WARRIORS Anzahl der aktiven Kämpfer im Core (Bei ARES max. 2)
CURLINE Nummer der aktuellen Instruktion

Der Wert für CURLINE ist besonders: Er repräsentiert die Nummer der Instruktion, in der er verwendet wird. Die erste Instruktion hat die Nummer 0.

Auch bei Bezeichnern für EQU ist die Groß/Kleinschreibung zu beachten, CORESIZE ist also ein anderer Bezeichner als CoreSize.

FOR/ROF

Bei der FOR-Anweisung handelt es sich um eine Schleife. Der Text, der zwischen FOR und ROF steht, wird mehrmals eingefügt. Aus
  FOR 3 
DAT #1
ROF
wird:
  DAT #1 
DAT #1
DAT #1
Man kann aber, ähnlich zu EQU, dem ganzen Block einen Label voranstellen. Dieser Label dient innerhalb des Blocks als "Zählvariable", die die Nummer der aktuellen Wiederholung beinhaltet. Aus
  n FOR 3 
DAT #n
ROF
wird:
  DAT #1 
DAT #2
DAT #3
Innerhalb einer FOR-Schleife kann man aber keine gewöhnlichen Labels verwenden, eine Angabe von
  FOR 3 
lab JMP lab
ROF
würde einen "Duplicate Label Error" bewirken, weil der Text lab JMP lab dreimal hintereinander eingesetzt würde. Um innerhalb einer FOR-Schleife Labels verwenden zu können, muß man sie um die fortlaufende Nummer erweitern. Aus
  n FOR 3 
lab&n JMP lab&n
ROF
wird:
  JMP   $0 
JMP $0
JMP $0

Verschachtelte FOR-Schleifen

Innerhalb von FOR-Schleifen dürfen weitere FOR-Schleifen enthalten sein. Aus
  n FOR 3 
m FOR 2
lab&n&m DAT #n, #m+4
ROF
ROF
wird
  DAT #1, #5 
DAT #1, #6
DAT #2, #5
DAT #2, #6
DAT #3, #5
DAT #3, #6
Bei verschachtelten Schleifen gibt es Unterschiede zwischen pmars und ARES - das betrifft EQU-Deklarationen innerhalb einer Schleife. Mehr dazu unter Kompatibilität

Direktiven

Content Management:

μCMS α1.6