Werte auf den Stack laden, is ja klar:
Situation auf dem Stack:Code:lds r16, A push r16 lds r16, B+0 push r16 lds r16, B+1 push r16
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:
2) Besser: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) AAAAAAAAber: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
Im hauptprogramm müssen jetzt noch die drein gepushten
Parameter wieder weg
Daher sieht das jetzt so aus
Is gar nicht so ohneCode: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







Zitieren

Lesezeichen