PDA

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&auml;ufig aufgerufen wird - in der Routin ist eine pause und mehrer jnb Befehle. Wird so ein jnb Befehl erf&uuml;llt h&uuml;pft mir logischerweise der MC aus der call routine weg, ohne mit einem ret abeschlossenen zu werden. Ich hab&#39; mir gedacht das ist nicht weiter schlimm, wenn ich dann in der aufgerufenen routine den sp 2 mal decrementiere - trotzdem st&uuml;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&#39;S f&uuml;r andere M&ouml;glichkeiten, die routine anst&auml;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 &#34;ins Leere&#34; l&auml;uft und damit andere Register willk&uuml;rlich durchl&auml;uft und ver&auml;ndert. Du kannst den betroffenen Programmteil zur besseren Analyse hier ja mal posten.

Import-Script
12.03.2002, 10:28
Hi, <BR>bei call&#39;s wird die momentane Adresse&#43;1&#40;2&#41; im Stack abgelegt und dann dec. Wenn du also nur dec ohne eine vern&uuml;nftige R&uuml;cksprungadresse auf dem Stack zu haben ist irgendwann Sense. Du solltest call&#39;s immer mit einem ret abschlie&szlig;en, wo du das machst ist egal. Wenn irgendwo doch mal ein ret auftritt ist es schon geschehen. <BR> <BR>Gru&szlig; Uwe

Import-Script
12.03.2002, 15:26
hi, <BR>kannst du nicht, wenn du mit dem jmp den call befehl verl&auml;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 &#40;z.B. f&uuml;r Timeouts&#41; mu&szlig; 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 &#40;und die niederwertigen&#41; nie wieder aufgerufen werden.

Import-Script
12.03.2002, 17:08
Bei RET kann man auch eine rel. unsaubere L&ouml;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 -&#62; irgendein Byte, was gerade nicht gebraucht wird. <BR> <BR>Nur musst Du nat&uuml;rlich beachten, dass nach dieser &#34;pop-Aktion&#34; niemals ein RET kommt, sonst verabschiedet sich Dein Programm in die W&uuml;ste... <BR> <BR>Gru&szlig; <BR>Andy

Import-Script
14.03.2002, 15:24
Hallo Christia <BR>wenn man den anspruch an sich stellt, einigerma&szlig;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&szlig; Carsten

Import-Script
14.03.2002, 17:03
Hi <BR>tut mir leid, ass ich mich so lange nicht mehr gemeldet habe ;-&#41; <BR>Ich hab&#39;s jetzt tats&auml;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&uuml;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 &#39;sauber&#39; programmieren.auch deine methode &#40;dec sp&#41; sollte keine probleme machen.da ich dein progi nicht kenne nur mal so &#39;ne vermutung: wenn ich dich richtig verstehe bereinigst du den stack in der dann aufgerufenen routine.k&ouml;nnte es sein, da&szlig; diese auch von anderen stellen im programm mit jmp o.&auml;. aufgerufen wird?dann verursacht die stackbereinigung nat&uuml;rlich &#39;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.&auml;. <BR> . <BR> . <BR> . <BR> <BR> mfg henne