ATmega32 CALL ohne SP vorher

Gast #3321951
>was passiert eigentlich, wenn ich mit CALL in ein Unterprogram
>springe, ohne vorher den Stackpointer gesetzt zu haben?

Probiers im Simulator aus. Altenativ könntest du statt deine
Zeit zu verschwenden auch gleich den Stackpointer setzen.
(Firma: guloshop.de) #3322027
Denis Meißner schrieb:
> was passiert eigentlich, wenn ich mit CALL in ein Unterprogram
> springe, ohne vorher den Stackpointer gesetzt zu haben?

Er wird korrekt ins Unterprogramm springen, egal, ob du den SP 
initialisiert hast oder nicht.

> Würde er dann in das letzte RET springen, dass ich gesetzt habe?

Die Frage verstehe ich nicht. Du meinst, was passiert, wenn das per CALL 
gestartete Unterprogramm mit RET beendet wird?

Falls der SP vorher nicht initialisiert wurde, wird der Programmablauf 
mit einiger Sicherheit an einer Stelle fortgesetzt, an der du es gar 
nicht haben willst. Anders ausgedrückt: das Programm stürzt 
wahrscheinlich ab.

Es bleibt die Frage, warum du den SP nicht initialisieren magst.
Gerade bei dem technisch schon länger nicht mehr aktuellen ATmega32 ist 
das wichtig, weil der SP sonst den Wert 0 hat. Du könntest natürlich 
auch den Nachfolger des Nachfolgers des ATmega32 verwenden: den 
ATmega324A.
Beim ATmega324A wird der SP nämlich automatisch mit dem richtigen Wert 
initialisiert, so dass du dich im Normalfall nicht darum kümmern musst. 
Zu empfehlen ist die explizite Initialisierung aber trotzdem, weil es ja 
sein kann, dass der Controller per Reset oder Brown-out neu gestartet 
wird.

Grundsätzlich kannst du natürlich auch ganz ohne SP arbeiten. Dann 
solltest du allerdings Assembler als Programmiersprache verwenden und 
ein paar Besonderheiten berücksichtigen...
#3322064
Hi.

Der SP wird bereits durch die Hardware nach einer RESET-Condition auf 
RAMEND gesetzt. (Ich weis, die glibc macht es danach nocheinmal in 
Software...)

Wenn du also nicht absichtlich den SP vorher verschoben hast, passiert 
absolut nichts (selbst wenn du mittels "naked" in "init0" starten 
wuerdest), weil alles wie gewohnt ablaueft.

MfG
Gast #3322092
What else is there to do on a sunday-afternoon, when your girl-friend 
has left you, your tv-set is broken and your jogging-suit is in the 
wash.
#3322111
Stephan B. schrieb:
> Beim ATmega32 ist SP initial undefiniert.

Nein, er ist 0.
Ein Call würde also die Returnadresse in R0 und 0xFFFF speichern wollen.
Die Register können zwar als SRAM adressiert werden, nicht jedoch als 
Stack.

Es ist also nicht der Stackpointer undefiniert, sondern der SRAM, auf 
den er zeigt.
(Firma: guloshop.de) #3322123
Stephan B. schrieb:
> In diesem Fall droht ein Unterprogrammaufruf unkontrolliert verwendete
> Variablen (oder sogar Register?) zu ueberschreiben.

Variablen werden erst nach mehreren verschachtelten Aufrufen 
überschrieben. So schnell schafft es der SP nicht von 0 aus (nach unten) 
ins SRAM.
Register werden nach meiner Erinnerung nicht überschrieben, weil diese 
Adressierungsart (gemappte Register) für den SP HW-technisch nicht 
implementiert wurde.

In Assembler ist es locker möglich, mit Unterprogrammen zu arbeiten 
(z.B. nur eine Ebene), ohne den Stack zu verwenden. Es muss ja nicht das 
klassische RCALL und RET sein. Sogar Interrupts sind dann möglich - 
sofern man eine feste Rücksprungstelle verwendet.
Das ist natürlich nur für spezielle Fälle sinnvoll, wenn man z.B. das 
gesamte SRAM für Variablen oder einen Puffer benötigt. Über seine 
Beweggründe hat Denis Meißner aber leider nichts verraten...
Gast #3322161
Hi

>Davon steht nichts im Datenblatt (soweit wie ich ueberflogen habe) und
>ich halte das auch fuer ein Geruecht.

Dann lies mal S.12 im aktuellen Datenblatt.

MfG Spess
Gast #3322200
Hi

Was gibt es da nicht zu glauben?

Datenblatt S.36:

Resetting the AVR

During Reset, all I/O Registers are set to their initial values, and the 
program starts execution from the Reset Vector.

MfG Spess

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.