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
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
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
"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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.