;******************************************************************************* ;* ;* Titel: Push un Pop auf dem Stapel beobachten ;* (B102_test_stack_push_pop_2.asm) ;* ;* Datum: 30/08/07 Version: 0.1 ;* Autor: WEIGU ;* ;* Simulation: ;* Prozessor: ATmega32 ;* ;* Informationen zur Funktionsweise: ;* ;* Der Stapel wird mit Studio 4 beobachtet. ;* ;******************************************************************************* ;------------------------------------------------------------------------------- ; Assembler Direktiven (u.a. Definitionsdatei einbinden) ;------------------------------------------------------------------------------- .NOLIST ;List-Output ausschalten .INCLUDE "m32def.inc" ;AVR-Definitionsdatei einbinden .LIST ;List-Output wieder einschalten .CSEG ;was ab hier folgt kommt in den Flash-Speicher ;------------------------------------------------------------------------------- ; Startadresse 0x0000 und ueberspringe ISR Vektoren ;------------------------------------------------------------------------------- .ORG 0x0000 ;Programm beginnt an der SRAM-Adresse 0h RESET: rjmp INIT ;springe nach INIT ;------------------------------------------------------------------------------- ; Sprungadressen fuer die Interrupts organisieren (ISR VECTORS) ;------------------------------------------------------------------------------- .ORG INT_VECTORS_SIZE ;Platz fuer ISR Vektoren lassen ;------------------------------------------------------------------------------- ; Initialisierungen und eigene Definitionen ;------------------------------------------------------------------------------- INIT: .DEF Tmp1 = r16 ;Register 16 dient als erster Zwischenspeicher ;Stapel initialisieren (fuer Unterprogramme bzw. Interrupts) ldi Tmp1,HIGH(RAMEND);RAMEND (SRAM) ist in der Definitions- out SPH,Tmp1 ;datei festgelegt ldi Tmp1,LOW(RAMEND) out SPL,Tmp1 ;------------------------------------------------------------------------------- ; Hauptprogramm ;------------------------------------------------------------------------------- MAIN: ldi r17,0x11 ;Register 17 initialisieren ldi r18,0x22 ;Register 18 initialisieren rcall SR1 ;Unterprogramm aufrufen nop ;no operation rjmp MAIN ;Weiter ;------------------------------------------------------------------------------- ; Unterprogramme ;------------------------------------------------------------------------------- SR1: push r17 ;Verwendeten Register retten push r18 ldi r17,0x33 ;Register 17 fuer lokale Verwendung SR1 init. rcall SR2 pop r18 ;Verwendete Register wiederherstellen pop r17 ret ;Zuruek ins Hauptprogramm SR2: push r17 ;Verwendeten Register retten ldi r17,0x44 ;Register 17 fuer lokale Verwendung SR2 init. pop r17 ;Verwendete Register wiederherstellen ret ;Zuruek ins Hauptprogramm ;------------------------------------------------------------------------------- .EXIT ;Ende des Quelltextes