Main:
  ldi R16, 6
  push R16
  ldi R16,7
  push R16

asm.Unterprogramme.Doku.ori-img001.png

Unterprogrammaufruf mit rcall addParams; die Rücksprungadresse auf den nächsten Befehl im Hauptprogramm wird automatisch auf den Stack gelegt

 

 

addParams:
  in ZHigh, SPH
  in ZLow, SPL

asm.Unterprogramme.Doku.ori-img002.png

Z wird auf die Position von SP gestellt; dadurch kann SP wieder verändert werden

 

   subi ZLow,-4

asm.Unterprogramme.Doku.ori-img003.png

Z = Z+4  dadurch zeigt Z jetzt auf den 1. Parameter, der an das Unterprog. übergeben wurde

 

   push R20    ; eigentlich über ldi …
  push R21
  ld R20,Z
  ld R21,-Z

asm.Unterprogramme.Doku.ori-img004.png

   add r20,r21   ; die eigentliche Rechenoperation
  st z,R20
  pop R21
  pop R20    ; die beiden Register wiederherstellen

asm.Unterprogramme.Doku.ori-img005.png

vor dem Rücksprung steht der Stackpointer SP wieder vor der Rücksprungadresse

 

ret

asm.Unterprogramme.Doku.ori-img006.png

der Programmzähler PC wird mit der Rücksprungadresse geladen; hier steht der erste Befehl nach der Rückkehr aus dem Unterprogramm

 

pop R2   ; holt das Ergebnis (13) ab
pop R1   ;dummy

 

asm.Unterprogramme.Doku.ori-img007.png

pop R1 ist notwendig, damit der SP wieder am Anfang steht