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


von Ralf (Gast)


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

von Ralf (Gast)


Lesenswert?

sorry..ich hatte ganz vergessen:

das ganze passiert auf einem Mega16 im AVR-Studio

grüsse Ralf

von Peter D. (peda)


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

von Ralf (Gast)


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

von Peter D. (peda)


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

von Ralf (Gast)


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

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.