mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik include-file Aufruf an der falschen Pc-Stelle


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich schreibe mit Assembler gerade ein Programm. Es sind einge
Funktionen zusammengekommen denen ich jeweils eine eigene Datei
spendiert habe. Allerdings habe ich beim Rücksprung einer Funktion das
Problem, dass er nicht direkt in die "Main" zurückspringt sondern
erst   eine andere Funktion anspringt. Betrachtet man sich den Unten
angehängten  Pc-Ausschnitt wird auch klar warum. Ich verstehe nur
nicht, warum er genau an der Pc-Stelle den include file lädt und wie
ich das verhindere?

Hoffe mir kann da jemand einen Tip geben

Grüsse Ralf


15:         pop r16
+00000016:   910F        POP     R16              Pop register from
stack
---- C:\Fachhochschule\mic\Programme\testbild\vortrabanten.asm
-------------------------
1:        Vortrabanten:;mit rcall bis zu ersten flanke 1.00µs
verzögerung
+00000017:   9508        RET                      Subroutine return
@00000018: vortrabanten

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry..ich hatte ganz vergessen:

das ganze passiert auf einem Mega16 im AVR-Studio

grüsse Ralf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Witz an Funktionen ist, daß sie mehrfach verwendet werden können.

Daher müssen sie immer dahin zurückkehren, von wo sie aufgerufen wurden
und sie tun dies auch.


Immer nur an eine bestimmte Stelle hinspringen heißt Sprung (RJMP).
Das geht allerdings nur dann gut, wenn zwischen 2 Durchläufen kein
offener RCALL liegt, d.h. ohne dazugehöhrendes RET und auch kein
offenes PUSH, d.h. ohne dazugehörendes POP, ansonsten crasht Dein Stack
!


"Betrachtet man sich den Unten angehängten  Pc-Ausschnitt wird auch
klar warum."

???

Das sind nur 2 völlig aus dem Zusammenhang gerissene Befehle ohne jede
Aussage, was soll man denn daran erkennen ?


Peter

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für Deine Antwort!

"Betrachtet man sich den Unten angehängten  Pc-Ausschnitt wird auch
klar warum."

naja also der pop an +00000016: und ret an +00000017: gehören zu der
vorherigen funktion die ich mit rcall aufrufe und mit ret verlasse.
Zwischen diesen beiden befehlen steht aber nun die Zeile:
---- C:\Fachhochschule\mic\Programme\testbild\vortrabanten.asm
-------------------------
1:        Vortrabanten:;mit rcall bis zu ersten flanke 1.00µs
verzögerung

...und in der tat, beim simulieren, nachdem poppen von r16 erscheinen
mir erstmal die Funktionen aus Vortrabanten.asm auf dem Bildschirm
bevor er den ret Befehl ausführt und dahinzurückspringt wo er
hergekommen ist.

Sorry, ich gebe zu mein Ausschnitt aus dem Dissambler ist nicht sehr
klar. Es handelt sich halt um das ende der einen funktion und der
anfang einer nächsten (Beide sollten nix miteinander zutun haben)

Grüsse Ralf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"erscheinen mir erstmal die Funktionen aus Vortrabanten.asm auf dem
Bildschirm"

Also die werden gar nicht falsch ausgeführt ?

Na dann ist doch alles richtig.

Wenns nur ne falsche Darstellung ist, könnts daran liegen, daß am Ende
der Files keine Leerzeile steht. Der WINAVR meckert mir das auch
regelmäßig an.


Ich würde der besseren Lesbarkeit wegen Includes aber nicht bunt
durcheinander mittendrin einfügen, sondern Macros und Deklarationen
alle am Anfang und Unterfunktionen alle am Ende.


Peter

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,
mein Problem war einfach, dass nach dem Compilieren, im Programmablauf
häufig in einer Funktion zwischen Poppen des letzten Registers und
"Ret" aus der Funktion plötzlich die includierung einer anderen Datei
erschien...obwohl ich alle Dateien die Funktionen enthalten Korrekt am
ende meines .csegs eingefügt hatte. Das hat zwar in den
Programmschritten nichts ausgemacht (zeit oder Takte) aber es wurde zB
bei Simulieren mit Einzelschritten die da nicht hingehörende Funktion
angesprungen. Das fand ich eben recht merkwürdig....aber seit ich
wirklich jedem File noch ein-zwei Leerzeichen (wie Du gesagt hast) am
Ende spendiert habe tut es...mehr als merkwürdig das Ganze.
nochma eben als Beispiel zu oben:

Ich befand mich in der Funktion "Zeile"
mit ausführung des Befehls ret am ende von "Zeile"
sprang er an die stelle vortrabanten:
von dort aus erst weiter zurück in den main file.
...jedenfalls danke Dir nochma für deinen Tip
Grüsse Ralf

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.