Archiv verlassen und diese Seite im Standarddesign anzeigen : Stack bei call Abbruch ohne ret
Import-Script
11.03.2002, 17:42
Hi <BR>in meinem Programm git es eine Routine, die relativ häufig aufgerufen wird - in der Routin ist eine pause und mehrer jnb Befehle. Wird so ein jnb Befehl erfüllt hüpft mir logischerweise der MC aus der call routine weg, ohne mit einem ret abeschlossenen zu werden. Ich hab' mir gedacht das ist nicht weiter schlimm, wenn ich dann in der aufgerufenen routine den sp 2 mal decrementiere - trotzdem stürtzt das PRogramm von zeit zu zeit ab und ich denke es liegt am oben beschriebenen..... <BR> <BR>Kann das sein oder muss ich den Fehler woanders suchen????? Was gibt'S für andere Möglichkeiten, die routine anständig zu beenden???? <BR> <BR>Vielen Dank an alle, die den Text immerhin mal gelesen haben...... <BR> <BR>mfg <BR>Christian
Import-Script
11.03.2002, 19:42
Soweit ich weiss ist es nicht zwingend notwendig eine Call Routine mit Ret abzuschliessen. Wichtig ist nur, dass das Programm nicht "ins Leere" läuft und damit andere Register willkürlich durchläuft und verändert. Du kannst den betroffenen Programmteil zur besseren Analyse hier ja mal posten.
Import-Script
12.03.2002, 10:28
Hi, <BR>bei call's wird die momentane Adresse+1(2) im Stack abgelegt und dann dec. Wenn du also nur dec ohne eine vernünftige Rücksprungadresse auf dem Stack zu haben ist irgendwann Sense. Du solltest call's immer mit einem ret abschließen, wo du das machst ist egal. Wenn irgendwo doch mal ein ret auftritt ist es schon geschehen. <BR> <BR>Gruß Uwe
Import-Script
12.03.2002, 15:26
hi, <BR>kannst du nicht, wenn du mit dem jmp den call befehl verlässt, als ersten befehl bei der anzuspringenden routine den ret befehl einsetzen? <BR>mfg pete
Import-Script
12.03.2002, 15:59
Versuchs mal mit 2 Bytes vom Stack holen, dann die neue anzuspringende Adresse als High und Low-Byte auf den Stack zu pushen und dann ein ordentliches RET hinterher. Dann sollte der MC statt zur alten Adresse zur neuen springen. <BR> <BR>Bei Interrupts (z.B. für Timeouts) muß ein RTI erfolgen, damit der Interrupt wieder freigegeben werden kann. Dort kann man nur mit dem oben genannten Trick an eine andere Adresse springen, sonnst kann der Interrupt (und die niederwertigen) nie wieder aufgerufen werden.
Import-Script
12.03.2002, 17:08
Bei RET kann man auch eine rel. unsaubere Lösung verwenden, funktioniert aber einwandfrei: <BR> <BR>call routine <BR>. <BR>. <BR>. <BR>. <BR>routine: <BR>. <BR>. <BR>. <BR>pop xx <BR>pop xx <BR>. <BR>. <BR>. <BR>. <BR>jmp irgendwohin <BR>. <BR>. <BR>. <BR> <BR>xx -> irgendein Byte, was gerade nicht gebraucht wird. <BR> <BR>Nur musst Du natürlich beachten, dass nach dieser "pop-Aktion" niemals ein RET kommt, sonst verabschiedet sich Dein Programm in die Wüste... <BR> <BR>Gruß <BR>Andy
Import-Script
14.03.2002, 15:24
Hallo Christia <BR>wenn man den anspruch an sich stellt, einigermaßen sauber zu Programieren, sollte ein Unterprogramm niemals mit einem jmp jb jnb verlassen werden. Man kan das Programm auch so gestalten das es ohne jmp Befehle funktioniert. <BR> <BR>Gruß Carsten
Import-Script
14.03.2002, 17:03
Hi <BR>tut mir leid, ass ich mich so lange nicht mehr gemeldet habe ;-) <BR>Ich hab's jetzt tatsächlichso geschafft wie meister es empfohlen hat und es weiter oben schon genannt wurde. Das dumme ist, dass es immer noch nicht sicher funktioniert!!!!! <BR> <BR>Naja halb so wild... <BR> <BR>Vielen lieben Dank für eure zahlreichen Antworten!!! <BR> <BR>mfg <BR>Christian
Import-Script
15.03.2002, 14:50
hallo, <BR> <BR>also meiner meinung nach kann man einen subroutinenaussprung mit stackbereinigung schon 'sauber' programmieren.auch deine methode (dec sp) sollte keine probleme machen.da ich dein progi nicht kenne nur mal so 'ne vermutung: wenn ich dich richtig verstehe bereinigst du den stack in der dann aufgerufenen routine.könnte es sein, daß diese auch von anderen stellen im programm mit jmp o.ä. aufgerufen wird?dann verursacht die stackbereinigung natürlich 'n bisschen chaos.sie <BR>sollte dann ungef. so beginnen: <BR> <BR>einsprung1: ;aufruf aus der subroutine <BR> dec sp <BR> dec sp <BR>einsprung2: ;aufruf mit jmp o.ä. <BR> . <BR> . <BR> . <BR> <BR> mfg henne
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.