Nächste Seite: Ausdrücke Aufwärts: Der M2Amiga-Assembler Vorherige Seite: Der M2Amiga-Assembler

## Die Syntax

Im Assembler wird Gross-/Kleinschreibung unterschieden, d.h. alle Mnemonics und Registerbezeichnungen müssen gross geschrieben werden! Dies mag zu Beginn etwas störend wirken, aber man gewöhnt sich schnell daran. Immerhin ist dies kein normaler Assembler, sondern ein Teil eines -Compilers!

Im Pseudomodul `SYSTEM` (siehe 5.3) existiert der Standardbezeichner `ASSEMBLE`, welcher an die Stelle des früher existierenden `INLINE` tritt. Der Aufruf des Assemblers geschieht als Standardprozedur auf folgende Weise:

> ``"`ASSEMBLE`"` `"`(`"` {befehl} `"`END`"` `"`)`"`.`

Durch diese Anweisung betritt man einen von völlig verschiedenen Syntax-Raum. Die Liste der reservierten Worte ist weit grösser und gänzlich verschieden von derjenigen in (siehe Tabellen 2.6 und 2.7). Diese Bezeichner überlagern die Namen aus dem -Raum, als wäre `ASSEMBLE` eine lokale Prozedur. Ist z.B. im aktuellen Sichtbarkeitsbereich eine Konstante ,,`MOVE``` deklariert, so hat man im Assembler darauf keinen Zugriff!

Einige ,,Laxheiten`` und Besonderheiten bestehen in der Abweichung von der Motorola-Syntax: statt `MOVEA` darf `MOVE` geschrieben werden. Analog darf `CMPA` und `CMPI` durch `CMP`, `SUBA` und `SUBI` durch `SUB`, sowie `ADDA` und `ADDI` durch `ADD` ersetzt werden. Zusätzlich erkennt er bei den Condition Codes des 68000 `HS` als `CC` und `LO` als `CS` an. So sind die Instruktionen `BHS Label` und `BCC Label` also gleichwertig. Schliesslich sind `A4` und `SB` 2.18, `A5` und `MP` 2.19, `A7` und `SP` 2.20 synonym.

Tabelle 2.6: Reservierte Worte des Assemblers (A-J)
`5pt`
`A0` | `BLE` | `DBCS` | `FATANH` | `FDBEQ` | `FGETMAN` | `FSGT` | `FTRAPF`
`A1` | `BLO` | `DBEQ` | `FBEQ` | `FDBF` | `FINT` | `FSIN` | `FTRAPGE`
`A2` | `BLS` | `DBF` | `FBF` | `FDBGE` | `FINTRZ` | `FSINCOS` | `FTRAPGL`
`A3` | `BLT` | `DBGE` | `FBGE` | `FDBGL` | `FLOG10` | `FSINH` | `FTRAPGLE`
`A4` | `BMI` | `DBGT` | `FBGL` | `FDBGLE` | `FLOG2` | `FSLE` | `FTRAPGT`
`A5` | `BNE` | `DBHI` | `FBGLE` | `FDBGT` | `FLOGN` | `FSLT` | `FTRAPLE`
`A6` | `BPL` | `DBHS` | `FBGT` | `FDBLE` | `FLOGNP1` | `FSNE` | `FTRAPLT`
`A7` | `BRA` | `DBLE` | `FBLE` | `FDBLT` | `FMOD` | `FSNGE` | `FTRAPNE`
`ABCD` | `BSET` | `DBLO` | `FBLT` | `FDBNE` | `FMOVE` | `FSNGL` | `FTRAPNGE`
`ADD` | `BSR` | `DBLS` | `FBNE` | `FDBNGE` | `FMOVECR` | `FSNGLE` | `FTRAPNGL`
`ADDA` | `BTST` | `DBLT` | `FBNGE` | `FDBNGL` | `FMOVEM` | `FSNGT` | `FTRAPNGLE`
`ADDI` | `BVC` | `DBMI` | `FBNGL` | `FDBNGLE` | `FMUL` | `FSNLE` | `FTRAPNGT`
`ADDQ` | `BVS` | `DBNE` | `FBNGLE` | `FDBNGT` | `FNEG` | `FSNLT` | `FTRAPNLE`
`ADDX` | `CAAR` | `DBPL` | `FBNGT` | `FDBNLE` | `FNOP` | `FSOGE` | `FTRAPNLT`
`AND` | `CACR` | `DBRA` | `FBNLE` | `FDBNLT` | `FP0` | `FSOGL` | `FTRAPOGE`
`ANDI` | `CAS` | `DBT` | `FBNLT` | `FDBOGE` | `FP1` | `FSOGT` | `FTRAPOGL`
`ASL` | `CAS2` | `DBVC` | `FBOGE` | `FDBOGL` | `FP2` | `FSOLE` | `FTRAPOGT`
`ASR` | `CCR` | `DBVS` | `FBOGL` | `FDBOGT` | `FP3` | `FSOLT` | `FTRAPOLE`
`BCC` | `CHK` | `DC` | `FBOGT` | `FDBOLE` | `FP4` | `FSOR` | `FTRAPOLT`
`BCHG` | `CHK2` | `DFC` | `FBOLE` | `FDBOLT` | `FP5` | `FSQRT` | `FTRAPOR`
`BCLR` | `CLR` | `DIVS` | `FBOLT` | `FDBOR` | `FP6` | `FSSEQ` | `FTRAPSEQ`
`BCS` | `CMP` | `DIVSL` | `FBOR` | `FDBSEQ` | `FP7` | `FSSF` | `FTRAPSF`
`BEQ` | `CMP2` | `DIVU` | `FBSEQ` | `FDBSF` | `FPCR` | `FSSNE` | `FTRAPSNE`
`BFCHG` | `CMPA` | `DIVUL` | `FBSF` | `FDBSNE` | `FPIAR` | `FSST` | `FTRAPST`
`BFCLR` | `CMPI` | `END` | `FBSNE` | `FDBST` | `FPSR` | `FST` | `FTRAPT`
`BFEXTS` | `CMPM` | `EOR` | `FBST` | `FDBT` | `FREM` | `FSUB` | `FTRAPUEQ`
`BFEXTU` | `CRP` | `EORI` | `FBT` | `FDBUEQ` | `FRESTORE` | `FSUEQ` | `FTRAPUGE`
`BFFFO` | `D0` | `EVEN` | `FBUEQ` | `FDBUGE` | `FSAVE` | `FSUGE` | `FTRAPUGT`
`BFINS` | `D1` | `EXG` | `FBUGE` | `FDBUGT` | `FSCALE` | `FSUGT` | `FTRAPULE`
`BFSET` | `D2` | `EXT` | `FBUGT` | `FDBULE` | `FSEQ` | `FSULE` | `FTRAPULT`
`BFTST` | `D3` | `EXTB` | `FBULE` | `FDBULT` | `FSF` | `FSULT` | `FTRAPUN`
`BGE` | `D4` | `FABS` | `FBULT` | `FDBUN` | `FSGE` | `FSUN` | `FTST`
`BGT` | `D5` | `FACOS` | `FBUN` | `FDIV` | `FSGL` | `FTAN` | `FTWOTOX`
`BHI` | `D6` | `FADD` | `FCMP` | `FETOX` | `FSGLDIV` | `FTANH` | `ILLEGAL`
`BHS` | `D7` | `FASIN` | `FCOS` | `FETOXM1` | `FSGLE` | `FTENTOX` | `ISP`
`BKPT` | `DBCC` | `FATAN` | `FCOSH` | `FGETEXP` | `FSGLMUL` | `FTRAPEQ` | `JMP`

Tabelle 2.7: Reservierte Worte des Assemblers (J-Z)
`JSR` | `MULS` | `PLOADR` | `RTE` | `SLE` | `SUBI` | `TRAPGT` | `TST`
`LEA` | `MULU` | `PLOADW` | `RTR` | `SLO` | `SUBQ` | `TRAPHI` | `TT0`
`LINK` | `NBCD` | `PMOVE` | `RTS` | `SLS` | `SUBX` | `TRAPHS` | `TT1`
`LSL` | `NEG` | `PMOVEFD` | `SB` | `SLT` | `SVC` | `TRAPLE` | `UNLK`
`LSR` | `NEGX` | `PSR` | `SBCD` | `SMI` | `SVS` | `TRAPLO` | `UNPK`
`MOVE` | `NOP` | `PTESTR` | `SCC` | `SNE` | `SWAP` | `TRAPLS` | `USP`
`MOVEA` | `NOT` | `PTESTW` | `SCS` | `SP` | `TAS` | `TRAPLT` | `VBR`
`MOVEC` | `OR` | `RELOCATION` | `SEQ` | `SPL` | `TC` | `TRAPMI` | `XREF`
`MOVEM` | `ORI` | `RESET` | `SF` | `SR` | `TRAP` | `TRAPNE` | `ZPC`
`MOVEP` | `PACK` | `ROL` | `SFC` | `SRP` | `TRAPCC` | `TRAPPL` |
`MOVEQ` | `PC` | `ROR` | `SGE` | `ST` | `TRAPCS` | `TRAPT` |
`MOVES` | `PEA` | `ROXL` | `SGT` | `STOP` | `TRAPEQ` | `TRAPV` |
`MP` | `PFLUSH` | `ROXR` | `SHI` | `SUB` | `TRAPF` | `TRAPVC` |
`MSP` | `PFLUSHA` | `RTD` | `SHS` | `SUBA` | `TRAPGE` | `TRAPVS` |

Als ,,befehl`` sind alle 68030- oder 68881/68882-Befehle, einer der unten beschriebenen Pseudo-Befehle oder ein Label erlaubt.

Ein Label
  ist ein unbekannter Bezeichner, direkt gefolgt von einem Doppelpunkt. Unbekannt bedeutet, dass es sich nicht um ein reserviertes Wort oder einen Bezeichner aus dem -Raum handeln darf. Die reservierten Worte von sind hier unbekannt, bis auf `END`, welches im Assembler ebenfalls definiert ist. Ein Label hat nur Gültigkeit innerhalb des aktuellen Assembler-Teils, lässt sich also weder von noch von einem anderen Assembler-Abschnitt ansprechen.2.21

  Definierte Label dürfen in Ausdrücken vorkommen, undefinierte Label hingegen nicht. Jeder unbekannte Bezeichner -- beispielsweise auch jeder Schreibfehler -- wird zunächst als Label angenommen, das innerhalb des Textes noch definiert werden muss. Dies führt leider unter bestimmten Umständen zu verwirrenden Fehlermeldungen. Ein Beispiel: In der Instruktion

  > ,,`MOVE.L #2000,d0```

  wird ,,`d0``` als undefiniertes Label erkannt, da es fälschlicherweise klein geschrieben wurde. Da die Adressierungsart aber absolut, und nicht -- wie es einem Label gebührt -- PC-relativ ist, erscheint die Fehlermeldung ,,`Relokation nicht eingeschaltet```. Am Ende des Textes kommt zusätzlich der Fehler ,,`Label nicht definiert: d0```.

Ein Pseudo-Befehl
  ist eines der folgenden Mnemonics:
Opcodes
  werden ganz normal der Prozessor-Syntax entsprechend geschrieben, im Gegensatz zu vielen anderen Assemblern aber ausschliesslich in Grossbuchstaben.

Das Zeilenende
  hat für den Assembler wie auch in keine besondere Bedeutung. Eine Trennung der Befehle durch den Beginn einer neuen Zeile ist nicht nötig, auch ein Semikolon hat hier nichts zu suchen! Ein ganzer Assembler-Text kann also durchaus in eine einzige Zeile geschrieben werden.

  Bei der Fehleranzeige im Editor oder mit dem Fehlerlister steht der Cursor meist am Beginn des nächsten Befehls, wobei sich die tatsächliche Fehlerposition im vorigen Befehl befindet. Andererseits kann sich eine einzige Assembler-Anweisung über beliebig viele Zeilen erstrecken; dies fördert gewiss nicht die Lesbarkeit, ist aber unter anderem bei Daten (`DC.x`) sehr nützlich.

Kommentare
  werden wie in angegeben, also durch ,,`(*``` und ,,`*)```, wobei hier wie sonst auch Compiler-Optionen angegeben werden können. Kommentare werden also keinesfalls durch ein Semikolon eingeleitet, wie sonst bei Assemblern üblich.

Modula-2-Bezeichner
  werden je nach Art des Importes qualifiziert oder unqualifiziert angegeben, genau wie in :

        IMPORT Terminal;
        FROM Terminal IMPORT waitCloseGadget;
        ...
          JSR    Terminal.Write(PC)
          TST.B  waitCloseGadget(A4)
        ...

Nächste Seite: Ausdrücke Aufwärts: Der M2Amiga-Assembler Vorherige Seite: Der M2Amiga-Assembler