Leitfaden

 

Hier werden die wichtigsten Punkte erklärt, die man beim Programmieren in Assembler für die C-Control Pro beachten muss:

 

Assembler Aufrufe sind atomar. Ein Assembleraufruf kann nicht vom Multithreading oder von der Bytecode Interruptroutine unterbrochen werden. Dies ist ähnlich wie bei den Aufrufen der Bibliothek. Ein Interrupt wird zwar von der internen Interruptstruktur registriert, aber die Bytecode Interrupt Routine wird erst nach Beendigung dem Assembler Prozedur gestartet.

 

Das Y-Register (R28 und R29) darf nicht verändert werden, es wird vom Interpreter als data stack pointer genutzt. Assembler Interruptroutinen benutzen das Y-Registers um Daten aus Registern zu sichern und können sonst abstürzen.

 

Die Register R0, R1, R22, R23, R24, R25, R26, R27, R30 und R31 können in Assembler Routinen ohne Sicherung benutzt werden. Benötigt man in Assembler andere Register, so muss man die Inhalte der Register vorher abspeichern. Man legt die Werte meist auf dem Prozessor Stack ab. Z.B:

 am Anfang: PUSH R5

            PUSH R6

 ...

 am Ende:   POP R6

            POP R5

 

Man verläßt die Assembler Routine mit einer "RET" Anweisung. Zu diesem Zeitpunkt muss der Prozessorstack wieder in dem Zustand sein, wie er vor dem Aufruf war. Auch die Inhalte der zu sichernden Register muss wiederhergestellt sein.

 

Das Debugging funktioniert nur im Bytecode Interpreter, ein Debuggen in Assembler ist nicht möglich.

 

Der Bytecode Interpreter hat eine feste Speichereinteilung. Auf keinen Fall Assembler Befehle für Datensegmente wie .byte, .db, .dw, .dseg  oder ähnliches benutzen. Dies würde den Assembler bei Zugriff auf diese Datensegmente dazu bringen Speicher zu überschreiben, der vom Bytecode Interpreter genutzt wird. Benötigt man globale Variablen, so sollte man diese in CompactC oder Basic deklarieren, und dann wie im Kapitel Datenzugriff beschrieben darauf zugreifen.

 

Nicht mit .org die Adresse Assembler Routine festlegen. Die IDE generiert beim Aufruf des AVRA Assemblers selber einen .org Befehl, der eingehalten werden muss.