next up previous
Nächste Seite: Register-Variablen Aufwärts: Die Register Vorherige Seite: Die Register D0 und


Register-Parameter

Prozedur-Parameter können, statt wie üblich auf dem Stack, auch direkt in den Registern übergeben werden. Dazu wird im Kopf der Prozedur hinter dem Namen des Parameters in geschweiften Klammern die Nummer des zu benutzenden Registers angegeben. Bei Prozedur-Typen wird das Register hinter dem Typenbezeichner angegeben.
\begin{example}
\begin{verbatim}TYPE writeProc = PROCEDURE(CHAR{0});
PROCEDURE Min(a{7},b{6}: INTEGER):INTEGER;\end{verbatim}\end{example}

Eine Mischung aus Register- und Stack-Parametern ist ohne weiteres möglich, ebenso müssen die angegebenen Register nicht in einer bestimmten Reihenfolge auftreten.

Jedes Register besitzt eine interne Nummer, die sich aus Tabelle 6.3 ergibt. Der Lesbarkeit halber schreibt man besser oktal, z.B. A3 als {13B} oder FP6 als {26B}. Es existiert ein Modul ,,R``, in dem die Konstanten aller Register definiert sind. Man sollte dieses Modul verwenden und dann sehr eindeutig und gut lesbar {R.A3} oder {R.FP6} schreiben.


Tabelle 6.3: Interne Registernummern
Register D0 D1 D2 D3 D4 D5 D6 D7
Nummer 0 1 2 3 4 5 6 7
Register A0 A1 A2 A3 A4 A5 A6 A7
Nummer 8 9 10 11 12 13 14 15
Register FP0 FP1 FP2 FP3 FP4 FP5 FP6 FP7
Nummer 16 17 18 19 20 21 22 23


Ein Registerparameter wird wie eine echte Variable behandelt, d.h. das zugehörige Register ist sicher vor Zerstörung geschützt (mit Ausnahme von D0 und D1, siehe 6.2.5). Nur explizite Zuweisungen können ihren Wert verändern.

Wie man sieht, ist es also durchaus möglich, VAR-Parameter oder Zeiger in Datenregistern oder Werte in Adressregistern zu übergeben. Hiervon ist jedoch abzuraten, da der Compiler zusätzlichen Code generieren muss, der die Geschwindigkeit des Programmes verringert. Um beispielsweise einen Zeiger in einem Datenregister zu dereferenzieren, muss dieser vorher in ein Adressregister kopiert werden, andererseits sind die meisten Berechnungen nur in Datenregistern möglich!

Jedes so belegte Register geht dem Compiler als ,,freies`` Register für interne Operationen und lokale Prozeduren verloren! Dies kann soweit gehen, dass Berechnungen oder Adressierungen nicht mehr ausgeführt werden können, was dann bei der Compilierung zu einer Fehlermeldung führt. Insbesondere bei Berechnungen von Ausdrücken des Typs LONGREAL ohne 68881-FPU werden sehr viele Datenregister benötigt. Jede WITH-Anweisung benötigt eines der sehr knappen Adressregister.

Man sollte sich also davor hüten, einer Prozedur allzuviele Registerparameter zu geben! Falls eine Prozedur mit vielen Registerparametern jedoch komplett in Assembler implementiert wird, treten Probleme meist nicht so auf, da der Programmierer die momentan gerade nicht benötigten Register beliebig abspeichern oder auf dem Stack ablegen kann.


\begin{warning}
Ein anderes ,,Problem\lq\lq  stellen lokale Prozeduren dar. Sie haben...
...rspr\uml {u}nglichen Werte wiederhergestellt werden m\uml {u}ssen!
\end{warning}


\begin{example}
Ein Beispiel zu den Register-Parametern:
\begin{verbatim}PROC...
...A0 & {\tt ADDRESS} \\
lr2 & FP0 & {\tt LONGREAL} \\
\end{tabular}\end{example}


next up previous
Nächste Seite: Register-Variablen Aufwärts: Die Register Vorherige Seite: Die Register D0 und
Claudio Nieder 2000-11-12