Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03255.jsonl.gz/1881

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