mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Vorzeitig Unterprogramm verlassen.


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

es handelt sich um einen ATMEGA8 in Assembler.
Mein Problem ist folgendes:

Ich rufe ein Unterprogramm via rcall auf.
Dieses Unterprogramm dient zur Ausgabe einer Zahl auf einem LCD. Also 
Umwandlung in ASCII Code. Das Unterprogramm beinhaltet weitere 
Unterprogramme.
Die Zahl wird mit Komma und entsprechendem Präfix ausgegeben. 
Dementsprechend müssen nicht alle Stellen in ASCII-Code gewandelt 
werden.
Dass als kurze Hintergrundinfo.
Hier beginnt nun mein Problem. Ich möchte also vorzeitig aus meinem 
Unterprogramm zurückkehren. Mit einem einfachen ret ist das ja nicht 
getan, da sich der Stackpointer nicht an der richtigen Stelle befindet.
Irgendwie erscheint es mir etwas unschön den Stackpointer manuell auf 
den richtigen Wert zu setzen.
Momentan handhabe ich das aber mangels anderer Kenntnis so.
Dazu speichere ich die Adresse des Stackpointers - zu der ich später 
zurückkehren möchte - zu Beginn des Unterprogramms im RAM. Also genau 
dann, wenn ich mich im Programm an dieser Stelle befinde.
Wenn ich das Unterprogramm verlassen möchte, da genügend Ziffern 
berechnet wurden, lade ich den Stackpointer mit dem zu Beginn 
gespeicherten Wert aus dem RAM. Nun reicht mir ein ja einfaches ret und 
ich gelange in mein Hauptprogramm zurück.

Wie kann ich das verbessern?

Gruß
Michael

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> aus meinem Unterprogramm zurückkehren.
Das geht mit einem ret

> Mit einem einfachen ret ist das ja nicht getan, da sich der
> Stackpointer nicht an der richtigen Stelle befindet.
Du willst aus einem Unterunterunterprogramm zurückkehren?
Dann ist dein Programmkonzept ungünstig oder zumindest extrem 
wartungsunfreundlich. Denn wenn du das Gebastel mit dem Stack in 2 
Jahren ansiehst, kapierst du selber nicht mehr, was da eigentlich 
passiert.

Gib aus der untersten Unterroutine ein Abbruchflag nach oben durch, 
damit jede andere Unterroutine weiß, dass jetzt Schluss ist.

> Wie kann ich das verbessern?
Da sollte man mal einen Blick auf deinen Code werfen können...

Autor: Alexander v. Grafenstein (avogra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja, aber du rufst doch noch unterfunktionen auf? deren 
rücksprung-adressen liegen dann ja immer noch auf dem stack. im 
günstigsten fall wächst dein stackpointer bei wiederholtem 
funktionsaufruf nur, solange, bis er etwas überschreibt oder überläuft.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schonmal Danke für die Antworten.
Ich denke ich werde es wirklich mit einem Hilfsregister/Flag machen.

Habe trotzdem mal den Code angehängt. Vielleicht ist es dann klarer.
Muss mich direkt dafür entschuldigen. Das ganze ist mehr ein Versuch.
So werde ich eigentlich keine Zahlen haben, welche 7 Byte einnehmen. 
Mich interressierte einfach nur die Realisierung. Man kann das natürlich 
deutlich schneller machen, indem man die Subtraktion und Addition nicht 
in einer Schleife durchführt, sondern für jede Zahl explizit macht. Habe 
mich mal dagegen entschieden, da es für mich so übersichtlicher 
erschien, zum mindest dachte ich mir das ; )

Der Code ist auch noch längst nicht final und wird wohl noch Fehler 
enthalten. Aber ich denke daraus ist meine Problematik ganz gut 
ersichtlich.

Gruß
Michael

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich denke ich werde es wirklich mit einem Hilfsregister/Flag machen.

Da würde sich z.B. das T-Flag anbieten. Das steht dir zur freien 
Verfügung und wird nicht vom Controller beeinflusst.

MfG Spess

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

hmm geht nicht so einfach, da ich das T-Flag bereits zur Unterdrückung 
führender Nullen benutze, aber ich denke, dass kriege ich schon hin ; )

Gruß
Michael

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.