
\subsection{Anordnung von Typen und Variablen}

\subsubsection{Typen}
\label{refAlign}
Wenn Sie Typen des Betriebssystems von C oder Assembler nach \mtwo{}
umsetzen m"ochten, m"ussen Sie die folgenden Tatsachen beachten.

Im \mtwoamiga{} werden Typen bis auf Bytegrenzen gepackt. Einige Beispiele
sollen dies verdeutlichen:
\begin{example}
\begin{verbatim}
  TYPE
    Tag = (mo, di, mi, do, fr, sa, so);
    Temperatur = [-50..100];
    Set = SET OF [0..7];
\end{verbatim}
\noindent
Alle oben genannten Typen nehmen nur ein Byte in Anspruch
und folgen im Speicher unmittelbar aneinander.
\end{example}

Typen, die mehr als ein Byte beanspruchen oder strukturiert sind,
beginnen immer an Wortgrenzen.

\begin{example}
Der Typ
\begin{verbatim}
   ARRAY [0..0] OF CHAR;
\end{verbatim}
\noindent
belegt also nur ein Byte ({\tt SIZE}=1). Ein Record-Element oder eine Variable
dieses Typs wird aber immer auf einer geraden Adresse liegen.
\end{example}

\begin{example}
Der Typ
\begin{verbatim}
   RECORD si:SHORTINT END;
\end{verbatim}
\noindent
belegt hingegegen {\em zwei Byte}. Nach dem eigentlichen Datenbyte wird
{\em automatisch\/} ein sogenanntes "`{\bf pad}"'-Byte (F"ullbyte) eingef"ugt.
\end{example}

Die Gr"osse ({\tt SIZE}) eines Records ist folglich immer gerade.

\begin{warning}
Aufgrund der eben erl"auterten Fakten ist es unm"oglich, dass innerhalb eines
Records zwei strukturierte Elemente mit ungerader Gr"osse direkt
 aufeinanderfolgen. Es wird immer ein F"ullbyte dazwischen liegen.
\end{warning}

Alle Elemente strukturierter Typen
({\tt RECORD}s und {\tt ARRAY}s) werden
in aufsteigender Richtung angelegt. Das Element $n+1$ eines Arrays
liegt auf einer h"oheren Speicheradresse als das Element $n$.

\subsubsection{Globale Variablen}

\label{refAlignLong}
Beim Deklarieren {\em globaler\/} Variablen werden diese in positiver Richtung,
also mit aufsteigender Adresse,
angelegt. Bei der Anordnung in Bezug auf gerade Adressen gilt das gleiche
wie bei den Typen. Ist jedoch die Option \optL{} eingeschaltet,
 werden sie sogar auf Langwortadressen gelegt; dies ist die
 Vorgabeeinstellung.
Lanwortadressen sind f"ur einige Strukturen
der Dos-library zwingend vorgeschrieben
(z.B. {\tt FileInfoBlock}), hat aber auch auf 32Bit-Prozessoren den
Vorteil des schnelleren Programmablaufs!
\begin{example}
\begin{verbatim}
  VAR                      rel. Adresse
  (*$ LongAlign:=FALSE *)
    i:INTEGER;                 2..3
    c:CHAR;                    4
    s:SHORTINT;                5
    a:ARRAY[0..2] OF CHAR;     6..8
    l:LONGINT;                10..13
  (*$ LongAlign:=TRUE *)
    i:INTEGER;                16..17
    l:LONGINT;                20..23
    a:ARRAY[0..2] OF CHAR;    24..26
    c:CHAR;                   28
    s:SHORTINT;               32
\end{verbatim}
\end{example}

Die Variablen eines Definitionsmoduls werden im Implementationsmodul
so "`fortgesetzt"', als sei die Trennung nicht vorhanden:
\begin{example}
\begin{verbatim}
  DEFINITION MODULE Demo;
  VAR                      rel. Adresse
  (*$ LongAlign:=FALSE *)
    c:CHAR;                    2
  END Demo.

  IMPLEMENTATION MODULE Demo;
  (*$ LongAlign:=FALSE *)
  VAR
    s:SHORTINT;                3
\end{verbatim}
\end{example}


\subsubsection{Lokale Variablen}

\label{alignLocVars}
{\em Lokale\/} Variablen werden in negativer Richtung --- also mit
absteigenden Adressen --- relativ zum Register A5 mit der gleichen
Anordnungsvorschrift wie die globalen Variablen angelegt. Die
Option \optL{} hat bei lokalen Variablen keine Bedeutung, da
zur Compilationszeit nicht festgestellt werden kann, ob der
Stackpointer zur Laufzeit auf eine Wort- oder Langwort-Adresse
ausgerichtet ist. Es wird so verfahren, als sei die Option
ausgeschaltet.
\begin{example}
\begin{verbatim}
  VAR                      rel. Adresse zu A5
    i:INTEGER;                 -2..-1
    c:CHAR;                    -3
    s:SHORTINT;                -4
    a:ARRAY[0..2] OF CHAR;     -8..-6
    k:SHORTCARD;               -9
    l:LONGINT;                 -14..-11
\end{verbatim}
\end{example}

\subsubsection{Prozedur-Parameter}

Die Parameter einer Prozedur werden
in positiver Richtung relativ zum Register A5 angelegt. Bei einer
{\em globalen\/} Prozedur beginnen die Parameter ab der relativen
Adresse 8, bei {\em lokalen\/} Prozeduren auf Adresse 12. Eine
Ausrichtung auf Bytegrenzen ist wegen des speziellen Verhaltens
des Stackpointers (Register A7) {\em nicht\/} m"oglich.

VAR-Parameter belegen 4 Byte, die Adresse der Variablen enthaltend,
offene Felder belegen 8 Byte, die Adresse und den HIGH-Wert (Anzahl
der Elemente - 1). N"aheres k"onnen Sie in Abschnitt \ref{refOpenArrays}
nachlesen.

\begin{example}
Das Beispiel einer globalen Prozedur:
\begin{verbatim}
  PROCEDURE Demo(         rel. Adresse
       arr:ARRAY OF CHAR     18..21 und 22..25
         s:SHORTINT;         16
         b:BOOLEAN;          14
         i:INTEGER;          12..13
     VAR c:CHAR);             8..11
\end{verbatim}
\end{example}

