next up previous
Nächste Seite: Erlaubte Operationen Aufwärts: Ausdrücke Vorherige Seite: Ausdrücke

Faktoren

Faktoren sind die elementaren Bestandteile eines Ausdrucks. Diese können sein:

Geklammerte Ausdrücke
. Die Klammerung erfolgt in diesem Assembler durch geschweifte (,,{`` und ,,}``), und nicht durch runde Klammern! Eine ,,normale`` Klammerung ist wegen der erweiterten Adressierungsarten des 68020 und höherer Prozessoren syntaktisch unmöglich (MOVE.L (2+2),A6 wäre zweideutig, indirekt oder absolut).
Ganze Zahlen
können binär, oktal, dezimal, hexadezimal oder als einzelnes Zeichen angegeben werden. Gleitkommazahlen sind nicht erlaubt. Die Schreibweisen ,,%1000010``, ,,@102``, ,,66``, ,,$42`` und ,,"B"`` repräsentieren dieselbe Zahl 66.
Zeichenketten
sind nur bei der Instruktion ,,DC.B`` erlaubt.
Label
, die im Assemblertext definiert sind oder noch definiert werden.
Modula-2-Konstanten
, die im aktuellen Sichtbarkeitsbereich liegen:
Record-Bezeichner
können benutzt werden, um die Offsets bestimmter Felder innerhalb eines RECORDs anzugeben,
,,DosD.Process.task.sigWait``
ergibt beispielsweise den absoluten Wert 22. Um nun ein Feld einer RECORD-Variablen anzusprechen, schreibt man ebenso einfach
,,myProcess.task.sigWait(A4)``,
vorausgesetzt, myProcess ist eine -Variable.
-Variablen
müssen 16Bit-relativ zu einem Adressregister adressiert werden. In M2Amiga ist dies immer A4. Nachdem ein anderes Register mit dem Inhalt von A4 geladen wurde, darf es natürlich auch relativ zu diesem Register sein. Dies gilt sowohl für moduleigene wie auch für importierte Variablen. Auch wenn der Offset einer Variablen bekannt ist, darf keinesfalls einfach ,,10(A4)`` geschrieben werden, da hier sehr wichtige Information verloren geht. Die Folge wäre, dass vom Linker falscher Code erzeugt würde!
-Variablen
werden absolut adressiert. Der Programmierer muss wissen, welchen Modus ( oder ) eine Variable hat; der Assembler erzeugt bei falscher Benutzung eine Fehlermeldung.
Lokale Variablen und Parameter
werden im allgemeinen relativ zum Register A5 adressiert. Der Wert ist im Gegensatz zu den -Variablen eine absolute Zahl, die den Offset zum Basisregister A5 der zugehörigen Prozedur in einer normalen Laufzeitumgebung -- also mit Eingangs- und Ausgangscode -- angibt.

Eine Besonderheit stellt hier die Adressierung von offenen Feldern dar. Angenommen arr1 sei ein Parameter vom Typ ARRAY OF typename, so bezeichnet arr1 die Adresse des Feldes und der HIGH-Wert (Anzahl der Elemente-1) liegt in ${\tt arr1}+4$. Dies gilt sowohl für Referenz- wie auch für Werte-Parameter!
\begin{example}
\begin{verbatim}PROCEDURE OADemo(VAR arr1: ARRAY OF INTEGER;
...
...(arr2) *)
MOVE.L arr2+4(A5),D1 (* HIGH(arr2) *)
...\end{verbatim}\end{example}

Falls die Variable oder der Parameter in einer äusseren Prozedur definiert ist, muss man sich zunächst den Inhalt des Registers A5 der zugehörigen Prozedur beschaffen! Dazu muss je Level der statische Link aus 8(A5) geladen werden. Beispiel:
\begin{example}
\begin{verbatim}PROCEDURE Lev0(int:INTEGER);
PROCEDURE Lev1;...
...ev0 *)
MOVE.W int(A0),D0 (* D0:=int von Lev0 *)
...\end{verbatim}\end{example}

Moduln
können nur dann adressiert werden, wenn es sich um Schnittstellen-Moduln handelt. Hier bezeichnet der Name des Moduls eine -Variable, die wie oben relativ zu A4 adressiert werden muss. Der Inhalt ist der Zeiger auf die Library. Beispiel:
\begin{example}
\begin{verbatim}MOVE.L DosL(A4),A6
MOVEQ  ...

Prozeduren
werden beim Aufruf immer d16(PC) adressiert. Um es einheitlich zu halten, sollte man Prozeduren des eigenen Moduls via BSR Proc aufrufen, modulfremde Prozeduren mittels JSR Proc(PC). Möchte man jedoch die Adresse einer modulfremden Prozedur ansprechen, muss absolut adressiert werden, beispielsweise durch LEA Proc, A0. Dies ist durch die Methoden des Linkers bedingt.
CODE-Prozeduren
ergeben den absoluten Offset, so dass man z.B. einfach JSR Forbid(A6) schreiben kann.
XREF-Bezeichner
erzeugen je nach Art der Benutzung eine 16- oder 32Bit Referenz (REF16, DREF16, REF32) für den Linker.
,,*``
bezeichnet den aktuellen Programmzähler. Dieser Faktor ist allerdings nur bei ,,DC.x`` erlaubt, um Differenzen zwischen Labeln bilden zu können! Die andere denkbare Nutzung, wie z.B. in ,,BRA *+4``, ist in diesem Assembler nicht möglich, da die nachträgliche Optimierung durch den Compiler diesen Sprung ins ,,Nirwana``2.22 schicken könnte! Man sollte also strikt mit Labeln arbeiten.


next up previous
Nächste Seite: Erlaubte Operationen Aufwärts: Ausdrücke Vorherige Seite: Ausdrücke
Claudio Nieder 2000-11-12