Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage Sprünge


von Manuel (Gast)


Lesenswert?

In meiner Anwendung wird ein Unterprogramm mit RJMP aufgerufen und am 
Ende wieder mit ret verlassen - die notwendigen register werden jeweils 
mit push und pop gesichert/zurückgeschrieben.

Für eine Fehlerbehandlung muss ich nun aus dem Unterprogramm 
hinausspringen und am ende der Fehlerbehandlung soll das Unterprogramm 
wieder von vorne ausgeführt werden.


...
rjmp Unterprogramm
...





Unterprogramm:
    push register
    ....
    SBRC Fehlervariable, 7
    RJMP error
    ...

    pop register
    ret


error:
    ...(was eben nach einem Fehler erledigt werden soll)

Wenn ich in der Fehlerbehandlung (error) nun das für eine erneute 
Ausführung des Unterprogramms notwendige
"pop register"
einfüge stimmt doch meine Rücksprungadresse auf dem Stack nicht mehr!?

Wenn ich vom error Teil direkt zum unterprogramm springe habe ich das 
register auf dem stack.

wenn ich das Error-unterprogramm wieder mit ret verlasse, macht er dort 
weiter, wo er nicht weitermachen soll...

wenn ich im Unterprogramm nach RJMP error folgendes einfüge:
    SBRC Fehlervariable, 7
    pop register
    SBRC Fehlervariable, 7
    rjmp Unterprogramm

habe ich doch zweimal die rücksprungadresse zu meinem Unterprogramm und 
komme mit meinem ret am ende des Unterprogramms nicht mehr zu meinem 
Hauptprogramm zurück.

Wie programmiert man dieses Konstrukt sauber?

Viele Grüße
Manuel

von Rene S. (gigastulle)


Lesenswert?

Du must dein unterprogram mit einem "Rcall" Befehl ausfüren um mit "ret" 
wieder zurück springen zu können !!! Wenn du den Ret befel so ausfürst 
ist doch die rücksprungadresse ungewiss

von Rene S. (gigastulle)


Lesenswert?

axo und wenn du den Rcall ausführst legt er die rücksprungadresse auch 
selber auf den Stack dann kanst du dir das mit dem push und pop sparen 
!!!
Vergiss aber nicht das du in einer Rcall-schleife immer die gleiche 
anzahl an push und pop befehlen haben must, damit deine 
rücksprungadresse beim ausführen des ret befehles auch die oberste 
adresse auf dem stack ist !!! sonst springt er überall hin nur nich 
zurück zum hauptprogramm

von Manuel (Gast)


Lesenswert?

ok, also nehme ich rcall für das aufrufen von 
programmteilen/subroutinen, aus denen ich zurückkehren möchte und rjmp 
bzw. jmp für alles, was nicht rücksprungfähig sein muss. folglich 
benötige ich für normale jmp's/rjmp's auch gar keine ret 's. Richtig?

von Manuel (Gast)


Lesenswert?

Entschuldigung: vielen Dank für die Hilfe :-)

von Rene S. (gigastulle)


Lesenswert?

Das ist korrekt und somit auch richtig. :D

von Manuel (Gast)


Lesenswert?

Besten Dank!
Und einen schönen verbleibenden Sonntag!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Manuel wrote:

> In meiner Anwendung wird ein Unterprogramm mit RJMP aufgerufen und am
> Ende wieder mit ret verlassen

Das ist falsch. Aufruf mit rcall und Rückkehr mit ret

> Für eine Fehlerbehandlung muss ich nun aus dem Unterprogramm
> hinausspringen und am ende der Fehlerbehandlung soll das Unterprogramm
> wieder von vorne ausgeführt werden.
>
> ...
> rcall Unterprogramm
> ...
>
> Unterprogramm:
>     push register
>     ....
>     SBRC Fehlervariable, 7
>     RJMP error_unterprogramm
>     ...
>
>     pop register
>     ret
>
> error_unterprogramm:
>     ...(was eben nach einem Fehler erledigt werden soll)
>
      pop register
      rjmp Unterprogramm

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
Noch kein Account? Hier anmelden.