next up previous
Nächste Seite: Optimierungen im Assembler Aufwärts: Der M2Amiga-Assembler Vorherige Seite: Resultate von Ausdrücken

Die Register-Benutzung im Assembler

Wie man im Abschnitt über die Register (6.2, Seite [*]) nachlesen kann, muss sich jede Prozedur an die Amiga-Konvention halten, kein Register ausser D1, D1, A0, A1, FP0 und FP1 zu verändern. Dies hat beim Schreiben von ASSEMBLE-Code normalerweise keine Auswirkungen, da der Assembler dem Compiler mitteilt, welche Register benutzt wurden. Diese werden somit innerhalb der umgebenden Prozedur in die Sicherung auf den Stack zum Prozedurbeginn und Wiederherstellung vom Stack am Prozedurende mit einbezogen.


\begin{warning}
Die Register A4 und A5 werden {\em niemals\/} automatisch auf d...
...se beiden Register sollten daher auch nie ver\uml {a}ndert werden.
\end{warning}

Wenn allerdings die gesamte Prozedur ohne Eingangs- und Ausgangscode in Assembler implementiert wird, ist der Programmierer für die Rettung und Wiederherstellung der benutzten Register (ebenso wie für die Parameter-Deallokation) selbst verantwortlich! Zudem ist A5 nicht initialisiert und gerettet. Während man in einer ,,normalen`` Umgebung z.B. schreiben kann:

       MOVE.L   parameter1(A5),D2
so müsste man ohne Eintrittscode z.B. schreiben:
       MOVEM.L  D2/D6/A6,-(A7)
       ...
       MOVE.L   parameter1-4+3*4(A7),D2
vorausgesetzt, der Stackrahmen ist noch in Ordnung. Der Wert $-4$ kommt dadurch zustande, dass A5 nicht durch eine LINK-Instruktion auf dem Stack liegt, $+3*4$ ergibt sich aus den drei geretteten Registern.

Ein anderer Aspekt betrifft kürzere Assembler-Teile innerhalb längerer Prozeduren. Hier kann kaum eine Aussage getroffen werden, welche Register momentan belegt sind und keinesfalls verändert werden dürfen. Für jeden WITH-Level -- drei sind maximal erlaubt -- wird je ein Adressregister reserviert, welche dies sind, ist jedoch unbestimmt. In einer CASE- oder FOR-Umgebung ist zudem der Stackpointer ,,verstellt``, was aber wenig ausmacht, da Parameter und lokale Variablen relativ zu A5 adressiert werden können. Ausserdem dürfen Register-Variablen und -Parameter nicht versehentlich verändert werden. Sicherste Methode ist hier, einfach die benutzten Register auf dem Stack zu retten, eine andere wäre, sich den erzeugten Code mit dem Dekoder anzusehen. Im letzteren Fall kann es natürlich passieren, dass eine spätere Compilerversion den Code anders generiert. Darum kann diese Methode nicht empfohlen werden.


\begin{example}
Ein Beispiel, das die Problematik erl\uml {a}utert:
\begin{verba...
...n Adressregister ,,freigemacht\lq\lq  und {\tt ptr} neu geladen werden.
\end{example}


next up previous
Nächste Seite: Optimierungen im Assembler Aufwärts: Der M2Amiga-Assembler Vorherige Seite: Resultate von Ausdrücken
Claudio Nieder 2000-11-12