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
Du musst 2 Werte aus dem Stack löschen, im einfachsten Falls 2x pop oder den Stackpointer und 2 erhöhen. Beim Verlassen aus dem Interrupt zusätzlich noch die Interrupts einschalten.
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??
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
Mein Rat: Verwende Deine Energie darauf, Dir eine "konventionelle" Lösung zu überlegen, und entscheide Dich für diese. Damit sparst Du Dir viele Nerven.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.