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.

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.

- In den Registern D0...D7 können `VAR`-Parameter beliebigen Typs (mit Ausnahme offener Felder) oder unstrukturierte Werteparameter, deren Grösse maximal ein Langwort ist, übergeben werden. Eine Ausnahme stellt der Typ `LONGREAL` dar. Für LONGREALs wird sowohl das angegebene als auch das nächsthöhere Register belegt, das angegebene Register sollte jedoch immer ,,gerade`` sein (D0, D2, D4 oder D6), damit der Compiler für die Berechnung von Ausdrücken genügend freie Registerpaare zur Verfügung hat.
- In den Addressregistern A0...A3 und A6 können `VAR`-Parameter sowie unstrukturierte Werteparameter der Grössen Wort und Langwort übergeben werden. Werte in Bytegrösse sind hier also verboten, ebenso wie die Register A4, A5 und A7!
- Parameter in den FPU-Registern FP0...FP7 dürfen nur vom Typ `LONGREAL` sein. Sie sind aber nicht in Definitions-Moduln anzugeben und in anderen auch nur dann deklarierbar, wenn die Compileroption für die FPU 68881 oder CPU 68040 eingeschaltet ist.
- Records oder Arrays sind nur als VAR-Parameter erlaubt, offene Felder sind gänzlich verboten!

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.

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