Hallo,
eben habe ich wie im Artikel
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Stack
vorgeschlagen, die Funktion des Stacks im Simulator beobachtet.
Hierzu habe ich das Beispiel-Programm für den ATmega8 im Simulator des
Atmel Studio 7 laufen lassen:
1 | .include "m8def.inc"
|
2 |
|
3 | .def temp = r16
|
4 |
|
5 |
|
6 | ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
|
7 | out SPH, temp
|
8 | ldi temp, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse
|
9 | out SPL, temp
|
10 |
|
11 | rcall sub1 ; sub1 aufrufen
|
12 |
|
13 | loop: rjmp loop
|
14 |
|
15 |
|
16 | sub1:
|
17 | ; hier könnten ein paar Befehle stehen
|
18 | rcall sub2 ; sub2 aufrufen
|
19 | ; hier könnten auch Befehle stehen
|
20 | ret ; wieder zurück
|
21 |
|
22 | sub2:
|
23 | ; hier stehen normalerweise die Befehle,
|
24 | ; die in sub2 ausgeführt werden sollen
|
25 | ret ; wieder zurück
|
Alles funktioniert wunderbar:
Bei rcall sub1 steht der PC auf 04.
Nach rcall sub1 erscheint im Memory Fenster auf dem Stack die
Rücksprungadresse 00 05.
Wenn man das Beispiel-Programm aber für den ATmega16 simuliert (Device
im Projekt und .include geändert), ist das Verhalten nicht
nachvollziehbar. Obwohl an gleicher Stelle der PC auf 04 steht,
erscheint nach Abarbeitung von rcall sub1 auf dem Stack 20 05 (s.
Screenshot).
Woher kommt die 20?
Habe ich hier etwas nicht verstanden? Bediene ich den Simulator falsch?
Es würde mich freuen, wenn mir jemand weiterhelfen könnte.
Weiter Beobachtungen:
Mit Device ATmega128 schreibt der Simulator wie erwartet 00 05 auf den
Stack. Selbiges gilt für den ATmega16, wenn man die Simulation im
AVRStudio 4 verwendet.
Vielen Dank für Eure Unterstützung