Skip navigation

ARES


Page Content:

Opcode Modifiers

Nachdem man mit den Adressierungsarten *, @, {, <, > sowie } festlegen kann, welches Feld (A oder B) als Pointer benutzt werden soll, fehlt noch eine Möglichkeit, z. B. den ADD-Befehl dahingehend zu steuern, daß das gewünschte Feld in der Ziel-Zelle benutzt wird. Dafür wurden im Extended-94 Standard die sogenannten Opcode Modifiers eingeführt. Damit kann bestimmen, mit welchen Operanden Ziel und Quelle arbeiten sollen.

Der ADD-Befehl, wie er bisher in den Beispielen gezeigt wurde, verwendet per Voreinstellung den Modifier .AB, was bedeutet, daß sich der Operand A des ADD auf das A-Feld (vermutlich desselben ADD) bezieht, und der B-Operator mit einem B-Feld arbeiten soll.

Wenn aber ein Wert zum A-Feld einer anderen Zelle hinzuaddiert werden soll, dann muß der Befehl lauten:
  ADD.A   #5,   +1    Addiere 5 zur 3
DAT #3, #4
Verwendet man den Modifier .B, dann passiert etwas seltsames:

Vor der Ausführung:
  ADD.B   #5,   +1    Addiere 1 zur 4
DAT #3, #4
Nach der Ausführung:
  ADD.B   #5,   +1    Addiere 1 zur 4
DAT #3, #5
Der A-Operand #5 bewirkt, daß als Quelle die selbe Zelle verwendet wird (A-Pointer = 0, siehe Adressierungsarten), jedoch der Wert des B-Feldes zum jeweiligen Feld des Zieles addiert wird. Im Ziel wird hier ebenfalls das B-Feld angesprochen.

Wenn du noch nicht verwirrt bist, dann versuche vorherzusagen, was passiert, wenn man den Modifier .F benutzt - er bewirkt, das beide Felder beider adressierter Zellen benutzt werden, quasi .A und .B zugleich:
  ADD.F   #5,   +1 
DAT #3, #4
Das Ergebnis ist ein DAT #8, #5, weil als Quelle mit #5 die Speicherzelle mit dem ADD-Befehl adressiert wurde. Als nächstes kommt der Modifier .BA:
  ADD.BA  #5,   +1    1 zur 3 hinzuaddieren
DAT #3, #4
Dann wäre noch der Modifier .X, er funktioniert wie .F, jedoch werden die Felder verkreuzt, als wäre es .AB und .BA zugleich. Versuche vorherzusagen, was folgender ADD bewirkt:
  ADD.X   +1,   #1 
DAT #3, #4
Wenn du glaubst, das Ergebnis sei eine Änderung im DAT, dann hast du übersehen, daß die Adress-Modi in diesem Beispiel anders angeschrieben sind, als in den vorigen. Das Ergebnis ist ADD.X +5, #4, denn als Quelle wurde +1 angegeben, als Ziel eine immediate-Adresse (b-Pointer = 0), wodurch 3 und 4 kreuzweise zu den Werten des ADD addiert wurden.

Aufmerksame Leser werden schon bemerkt haben, daß es hier schnell zu Verwechslungen kommen kann. Das bekommt man nur mit Übung in den Griff. Im Zweifelsfall muß man sich einfach ein kleines Testprogramm schreiben, um die Wirkungsweise auszuprobieren, bevor man sein eigentliches Programm weiterschreiben kann. Weitere Information zur Wirkungsweise der Opcode Modifiers findest du auch in der Redcode-Referenz. Die Modifier gelten natürlich für alle Opcodes, haben aber nicht immer Sinn.

Solltest du jetzt nicht verwirrt sein, dann hast du vermutlich nicht versucht, jedes Beispiel ganz zu verstehen ;-)

Default Modifiers

Die folgende Liste zeigt, wie Opcodes ohne angegebe Modifier automatisch ergänzt werden, wenn man mit dem ICWS-94 Standard arbeitet. Bis auf manche Experimental Mode-Befehle verwendet pmars die selbe Tabelle. Die Default Modifiers sind so gewählt, daß sie der intuitiven Erwartung entsprechen. Es ist üblich, Modifiers nur dann anzuschreiben, wenn sie von den Defaults abweichen. Für ICWS-88 gelten andere Defaults, als für ICWS-94, die Tabelle kann man in den Optionen von ARES nachschlagen ("Conversion") oder im Draft-94.

Default Modifiers für ICWS-94 und Bluecode
Opcode A-Mode B-Mode Default
DAT,NOP #$@<>*{}& #$@<>*{}& F
MOV,CMP,SEQ,SNE # #$@<>*{}& AB
MOV,CMP,SEQ,SNE $@<>*{}& # B
MOV,CMP,SEQ,SNE $@<>*{}& $@<>*{}& I
ADD,SUB,MUL,DIV,MOD # #$@<>*{}& AB
ADD,SUB,MUL,DIV,MOD $@<>*{}& # B
ADD,SUB,MUL,DIV,MOD $@<>*{}& $@<>*{}& F
SLT,LDP,STP,PSH # #$@<>*{}& AB
SLT,LDP,STP,PSH $@<>*{}& #$@<>*{}& B
JMP,JSR,SPL,JMZ,JMN,DJN #$@<>*{}& #$@<>*{}& B
BRK,RET,POP #$@<>*{}& #$@<>*{}& B

Ausdrücke

Content Management:

μCMS α1.6