AVR Assembler - Unterprogramme

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche


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