Pfad: Home => AVR-Übersicht => Software => JUMP-Befehl

; 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 "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


©2002 by http://www.avr-asm-tutorial.net