ATmega32 CALL ohne SP vorher

Gast #3321951
Lesenswert?

>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
Lesenswert?

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
Lesenswert?

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
(Firma: guloshop.de) #3322123
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren