///Title:Unterprogramme ///Author: kner 2009 ///Date: 2009 ///Description: Unterprogramme, Stack, Stackpointer, Parameterübergabe Aufgabenstellung: der Stackpointer in der Assemblerprogrammierung Schwierigkeitsgrad: schwer Dauer: 2h 1. Verzweigung zu Unterprogrammen 2. Norm für Unterprogramme: keine veränderten Register 3. RET als Sprungbefehl 4. Parameter-Übergabe an Unterprogramme */ .INCLUDE .LIST .DEVICE Atmega8 // --------------------------------- main ------------------------------ .def temp = r16 .def ZLow = r30 .def ZHigh = r31 ldi temp, HIGH(RAMEND) ; Stackpointer initialisieren out SPH, temp ldi temp, LOW(RAMEND) ; Stackpointer initialisieren out SPL, temp rcall sub1 ; sub1 aufrufen // Parameterübergabe an Unterprogramme über den Stack // die Parameter 6 und 7 werden übergeben, addiert und das Ergebnis 13 zurückgegeben ldi temp, 6 push temp ldi temp, 7 push temp rcall AddParams pop r2 pop r1 EndMain: rjmp EndMain // --------------------------------- subs ------------------------------ sub1: rcall sub2 ; sub2 aufrufen nop nop ret ; wieder zurück sub2: ; hier stehen normalerweise die Befehle, ; die in sub2 ausgeführt werden sollen ret ; wieder zurück AddParams: IN ZHigh, SPH IN ZLow, SPL ; Stackpointer durch Z ersetzen SUBI ZLow, -4 PUSH R20 ; Register retten PUSH R21 LD R20, Z ; 1. Parameter nach R20 LD R21, -Z ; 2. Parameter nach R21 ADD R20, R21 ST Z, R20 ; Ergebnis auf den Stack (2. Parameter) POP R21 POP R20 ; gerettete Register zurückholen ret