Navigation:  Compiler > Assembler >

Leitfaden

Vorherige SeiteZurück zur Kapitel ÜbersichtNächste Seite

 

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

 

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.

 

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 muß 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 muß der Prozessorstack wieder in dem Zustand sein, wie er vor dem Aufruf war. Auch die Inhalte der zu sichernden Register muß 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 muß.