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
Lesezeichen