next up previous
Nächste Seite: M2Amiga-Prozeduren in fremden Sprachen Aufwärts: Der Linker (m2l) Vorherige Seite: Kurze Sprünge

Einbindung von C- und Assembler-Code

Referenzen auf M2Amiga-fremde Symbole können auf drei Arten erzeugt werden: durch ASSEMBLE( XREF...) sowie durch die Deklaration externer Prozeduren oder Variablen (5.1.13 und 5.1.12).
\begin{example}
Beipiel:
\begin{verbatim}VAR MyMenu [ < ''MyMenu_Strip'' ]: M...
...rImage
LEA MyMenu(A4),A0
LEA PointerImage,A1
END);\end{verbatim}\end{example}

Der Unterstrich in den Symbolen bietet die freie Namenswahl. Der Linker kann nur in zwei Fällen wissen, in welchen Dateien er die Symbole suchen soll: bei der Option ,,-lName`` oder wenn der Name in der Mitte einen Unterstrich besitzt.

Im zweiten Fall muss die Datei allerdings den Namen des Teils vor dem ersten Unterstrich und die Endung ,,.obj`` (oder ,,.ob1`` usw.) haben und im Projekt oder Pfad richtig plaziert sein. Dies hat den enormen Vorteil, dass beim Linken keine zusätzlichen Namen angegeben werden müssen, und dass sogar mehrere Versionen für verschiedene Prozessoren existieren können! In obigem Beispiel wird das Symbol ,,MyMenu_Strip`` automatisch in der Datei MyMenu.obj gesucht. Da ,,PointerImage`` keinen Unterstrich enthält, muss die zugehörige Datei per Option ,,-lFile`` angegeben werden.

Beim Einbinden von C-Prozeduren ist zu bedenken, dass diese ihre Parameter im Gegensatz zu in umgekehrter Reihenfolge auf dem Stack erwarten, keine offenen Feldparameter kennen und ihre Parameter nicht deallozieren. legt die Parameter von links nach rechts auf dem Stack ab, der erste Parameter liegt also auf der höchsten Adresse (der Stack ,,wächst`` nach unten!), in C liegt der erste Parameter an der niedrigsten Adresse.
\begin{warning}
W\uml {a}hrend man durch ,,Umdrehen\lq\lq  der Parameter-Reihenfolge...
... lassen sich Prozeduren mit reinen Register-Parametern
einbinden.
\end{warning}

Alle bekannten C-Compiler halten sich an die Register-Konventionen, sodass keine Probleme mit zerstörten Registern auftreten.

Variablen, die als externe -Variablen oder via XREF eingebunden werden sollen, müssen in einem Hunk mit dem Namen ,,__MERGED`` liegen, dürfen dann aber auch nur vom Typ DATA oder BSS sein, keinesfalls CHIP oder CODE. Weiterhin dürfen keine 32Bit-Relokationen von anderen Hunks auf diese Variablen existieren.

Um ein Programm reentrant zu linken, dürfen keine -Variablen im Programm vorhanden sein, ebenso keine CHIP-DATA- oder CHIP-BSS-Hunks. Sollen Daten eingebunden werden, die von vornherein im CHIP-Memory liegen (z.B. Image-Daten, nicht die Image-Struktur), so sollten diese unveränderlich sein und als CHIPCODE deklariert werden.

Wird auf die Residentfähigkeit des Programmes verzichtet, so ist bis auf eines alles erlaubt: CODE darf niemals in einem Hunk mit dem Namen ,,__MERGED`` liegen. Alle Merged-Hunks zusammen dürfen niemals mehr als 64kByte belegen.


next up previous
Nächste Seite: M2Amiga-Prozeduren in fremden Sprachen Aufwärts: Der Linker (m2l) Vorherige Seite: Kurze Sprünge
Claudio Nieder 2000-11-12