AVR Assembler - Unterprogramme
Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Aufruf
Unterprogramme werden beim AVR mit dem Befehl "rcall" aufgerufen, wobei man als Operand die relative Adresse (z.B. "-20") oder ein Label (z.B. "loop") angibt.
Parameterübergabe
Auf Prozessoren mit vielen Registern ist es sinnvoll ein paar Register zur Parameterübergabe zu reservieren, z.B. R12-R15 (je nach Bedarf mehr oder weniger).
.def par1 = r12 .def par2 = r13 .def par3 = r14 .def par4 = r15 .def temp = r16 main: ; Stackpointer sollte insbes. bei Nutzung von Unterprogrammen immer ; initialisiert werden, z.B. beim ATmega16 so: ldi temp, LOW(RAMEND) ; LOW-Byte of upper RAM-Adress out SPL, temp ldi temp, HIGH(RAMEND) ; HIGH-Byte of upper RAM-Adress out SPH, temp ; Umweg über r16, da r0-r15 nicht direkt mit Konstanten arbeiten können ldi temp, 0x20 mov par1, temp rcall unterprogramm unterprogramm: ; irgendetwas tun ret