rjmp aus Interrupt/Unterprogramm

Gast #587283
Lesenswert?

Moin,
habe mal wieder eine Frage:
Ich möchte bei einem Programm in einem Unterprogramm eine Bedingung 
testen und je nach Ergebnis mit ret zurückspringen oder mit rjmp bei 
einer Marke weitermachen. Im Programm gibt es damit keine Probleme, also 
es kann dadurch nichts Unvorhergesehenes eintreten. Was muss ich machen 
um nach dem rjmp wieder 'aufzuräumen', also zum Beispiel die 
Rücksprungadresse aus dem Stack zu löschen?
Was müsste ich machen, wenn ich das gleiche aus einem Interrupt mache, 
außer mit sei die Interrupts wieder zu aktivieren?
Dussel
Gast #587310
Lesenswert?

man kan es hintricksen, sollte aber nicht.
Jede Funktion hat nur einen einzigen Ausgang, und der heisst return.
Niemand hindert dich, in einer Funktion eine andere aufzurufen (ok, 
irgendwann der stack), oder innerhalb der Funktion vor Rückkehr weiter 
innerhalb der Funktion zu verzweigen.
Konstrukte, die du da vor hast, funktionieren zwar, sind aber nicht 
wartbar/nach 1 Jahr unverständlich. Es bringt nichts, macht Probleme, 
warum sollte man es tun??
Gast #587319
Lesenswert?

Die Übersichtlichkeit ist kein Problem, weil das in einem Block des 
Programms vorkommt. Ist wie goto in Programmiersprachen, sollte man 
nicht verwenden, manchmal ist es aber praktisch.
Muss ich dann, um den Stackpointer zu erhöhen, SPH+SPL um zwei erhöhen?
Dussel
#587429
Lesenswert?

Dussel wrote:
> Die Übersichtlichkeit ist kein Problem, weil das in einem Block des
> Programms vorkommt. Ist wie goto in Programmiersprachen, sollte man
> nicht verwenden, manchmal ist es aber praktisch.
> Muss ich dann, um den Stackpointer zu erhöhen, SPH+SPL um zwei erhöhen?
> Dussel

In der Zeit, die der Mega8 braucht um den Stackpointer manuell
zurpclzusetzen und zurückzuspringen, kann er genausogut deinen
(einzigen) ret anspringen, der dann den Stackpointer aufräumt.

Ergo: Da es zeitlich völlig egal ist, ist es besser sich an
die Konvention zu halten: Es gibt nur einen Ausstieg aus
einer Funktion. Will eine Programmteil vorzeitig einen
Ausstieg, dann hat es diesen einen Ausstieg anzuspringen.

Spätestens dann, wenn du mittels Push/Pop Register sicherst,
oder das SREG in einem anderen Register gesichert hast,
wirst du dir selbst dankbar dafür sein, dich an Konventionen
gehalten zu haben.

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