User manual

221 C-Control Pro IDE
© 2013 Conrad Electronic
Rückgabe von Werten
In der Routine proc2 wird auch die Summe zurückgegeben. Rückgabewerte werden auf den Parame-
ter Stack (PSP) des Bytecode Interpreter geschrieben. Der Zeiger auf den PSP liegt im Registerpaar
R6,R7. Man muss vorher allerdings eine 4 auf den PSP Zeiger addieren, dann kann man den Wert
dort speichern. Im Gegensatz zur Parameterübergabe spielt der Typ des ckgabeparameters keine
Rolle. Auf dem Parameterstack sind alle Parameter immer 4 Bytes lang.
Auch bei einem 8-Bit ckgabewert erwartet der Interpreter immer einen 16-Bit Wert, dies wird
gemacht um Bytecodes im Interpreter einzusparen. Ist die Assemblerroutine als byte deklariert,
muss ein word als ckgabewert geschrieben werden, ist die Assemblerroutine vom Typ char, ist
ein int erforderlich. In allen anderen Fällen ist keine Änderung erforderlich.
; return a + c
MOVW R30, R6 ; copy stack pointer from R6
ADIW R30, 4 ; add 4 to sp - ADIW only works for R24 and greater
MOVW R6, R30 ; copy back to stack pointer location
ST Z+, R26 ; store R26, R27 on stack
ST Z, R27
4.4.3 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 Biblio-
thek. Ein Interrupt wird zwar von der internen Interruptstruktur registriert, aber die Bytecode Inter-
rupt 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 si-