mikrocontroller.net

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


Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rene Schir (gigastulle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rene Schir (gigastulle)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung: vielen Dank für die Hilfe :-)

Autor: Rene Schir (gigastulle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist korrekt und somit auch richtig. :D

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Besten Dank!
Und einen schönen verbleibenden Sonntag!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.