next up previous
Nächste Seite: Register-Parameter Aufwärts: Die Register Vorherige Seite: Das Register A6


Die Register D0 und D1

Diese beiden Register werden sehr häufig benötigt und sind deshalb etwas problembehaftet. Sie werden als Parameter-Register für sehr viele Betriebssystem-Prozeduren und auch als Resultat-Register von Funktionsprozeduren benutzt.

Ein (noch) ungelöstes Problem tritt genau dann auf, wenn sich in D0 ein Registerparameter befindet und eine Funktionsprozedur aufgerufen werden soll. Da diese Prozedur ihr Resultat in D0 liefert, muss der Parameter zwangsläufig zerstört werden, da er fest an D0 gebunden ist und somit weder in ein anderes Register noch in einer Variablen zwischengespeichert werden kann! Andere Register als D0 und D1 werden in einem solchen Fall auf dem Stack zwischengespeichert und nach dem Prozeduraufruf wieder geladen, aber in diesem Fall ist es nicht möglich, da das Zurückladen von D0 das Funktionsresultat zerstören würde. Der Compiler meldet bei einem derartigen ,,Konflikt`` einen Fehler; die gewünschte Operation ist grundsätzlich nicht durchführbar. In diesem Fall muss der Parameter an ein anderes Register ,,gebunden`` werden. Das Gleiche gilt genauso für D1, obwohl eine korrekte Verarbeitung manchmal vielleicht doch möglich wäre (D0 und D1 sind compilerintern fest verbunden). Hier hilft also nur die Vermeidung von D0 und D1 als Registerparameter.

Nur für die beiden Register D0 und D1 existiert die Compiler-Option , die nach dem Setzen auf FALSE (Kommandozeile Option ,,-z``) folgendes bewirkt: soll eine Prozedur aufgerufen werden, die Parameter in D0 und/oder D1 erwartet, so werden die Werte nicht zwischenzeitlich auf den Stack, sondern gleich in die entsprechenden Register geschrieben. Dadurch wird Code gespart und das Programm wird schneller laufen. Bestehen diese oder weitere Parameter jedoch aus Ausdrücken, die zusätzliche Funktionsaufrufe implizieren, müssen deren Resultate ja in D0 und/oder D1 ankommen, würden also die bereits errechneten Werte überschreiben! In diesem Fall meldet der Compiler den Fehler ,,Register D0 oder D1 belegt``. Dieser Prozeduraufruf muss dann also mit der Option ,,StackParms:=TRUE`` compiliert werden, womit eine temporäre Ablage der Parameter auf dem Stack erreicht wird und eine Zerstörung unmöglich ist.


\begin{example}
Ein Beispiel, bei dem der Compiler ohne die angegebene Option
ei...
...UE *)
Reg0(Val(),Val());
(*$ POP StackParms *)
...\end{verbatim}\end{example}


next up previous
Nächste Seite: Register-Parameter Aufwärts: Die Register Vorherige Seite: Das Register A6
Claudio Nieder 2000-11-12