; Testet Unterprogrammaufrufe über den Stack ; ; Die Unterprogrammaufrufe erfolgen nicht über den RCALL- ; Befehl, sondern über den Stack. D.h. zuerst wird die ; Rücksprungadresse auf dem Stack abgelegt, dann die Adresse ; des Unterprogrammes, das aufgerufen werden soll. Der ; Sprung und der Rücksprung erfolgen dann über den RET- ; Befehl. ; Diese Adressierungsart ist für Unterprogrammaufrufe aus ; Tabellen günstig, weil man die Adressen dann aus einer ; Tabellenspalte auslesen kann. ; .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; .DEF mpr=R16 ; Wie immer ein allgemeines Arbeitsregister ; ; Reset-/Interrupt-Vektortabelle ; rjmp main ; main: ldi mpr,HIGH(RAMEND) ; Stack einrichten out SPH,mpr ldi mpr,LOW(RAMEND) out SPL,mpr ldi mpr,LOW(retret) ; Lege Rücksprungadresse auf stack push mpr ldi mpr,HIGH(retret) push mpr ldi mpr,LOW(testup) ; Lege Sprungadresse auf stack push mpr ldi mpr,HIGH(testup) push mpr ret ; Springe zum Unterprogramm ; ; Das anzuspringende Rücksprungprogramm macht alle Lampen an ; retret: ldi mpr,0x00 ; Mache alle Lampen an, wenn erfolgreich out PORTB,mpr loop: rjmp loop ; Anhalten ; ; ; Testprogramm, das angesprungen werden soll ; testup: ldi mpr,0xFF ; Alle Lampentreiber auf Ausgabe out DDRB,mpr ret ; Rücksprung an die Aufrufadresse