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.

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 kommt dadurch zustande, dass A5 nicht durch eine `LINK`-Instruktion auf dem Stack liegt, 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.

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