Werte auf den Stack laden, is ja klar:
Code:
          lds r16, A 
          push r16 
          lds r16, B+0 
          push r16 
          lds r16, B+1 
          push r16
Situation auf dem Stack:
stckp + 2 -> wert A
stckp + 1 -> wert B+0
stckp + 0 -> wert B+1

aaaaaaber:
Jetz rufst du dein Unterprogramm
RCALL Unterprogramm

und so sieht daher der Stack beim Unterprogramm aus
stckp + 4 -> wert A
stckp + 3 -> wert B+0
stckp + 2 -> wert B+1
stckp + 1 -> rücksprungadresse Hi
stckp + 0 -> rücksprungadresse Lo

Jetzt gibt's mehre Möglichkeiten:
1) Brutal und nicht schön, geht aber:
Code:
Unterprogramm: 
        pop   r0       rücksprungadresse sichern    
        pop   r1       rücksprungadresse sichern      

        pop   R25    (B+1,  siehe oben)
        pop   R24    (B+0,  siehe oben)
        pop   R16    (A,  siehe oben)

;--- irgendwas machen, R0 und R1 aber in Ruhe lassen

        push   r1       rücksprungadresse wieder auf den Stack
        pop    r0       r0, r1 immer symmetrisch poppen, pushen !  
        ret
2) Besser:
Code:
Unterprogramm: 
                IN            ZL, SPL       Stackpointer nach ZL:ZH 
                IN            ZH, SPH                übernehmen
; und mit "Offset"  in die Zielregister laden
                LDD          R25, Z+2      (B+1,  siehe oben)
                LDD          R24, Z+3      (B+0,  siehe oben)
                LDD          R16, Z+4      (A,  siehe oben)

;--- irgendwas machen

               RET
2) AAAAAAAAber:
Im hauptprogramm müssen jetzt noch die drein gepushten
Parameter wieder weg
Daher sieht das jetzt so aus
Code:
          lds r16, A 
          push r16 
          lds r16, B+0 
          push r16 
          lds r16, B+1 
          push r16 
        RCALL    Unterprogramm 
         pop     r0    (irgendein Register)
         pop     r0    (irgendein Register)
         pop     r0    (hauptsache, der Stack stimmt wieder)

------- jetzt ist alles wieder paletti
Is gar nicht so ohne