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.
|
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.