e.full Geschrieben 29. November 2008 Geschrieben 29. November 2008 hallo habe da mal wieder eine frage. und zwar habe ich folgenden stackausschnitt, ich soll annehmen dass der stack in richtung niedriger adressen wächst, und dass die aufrufkonvention folgendes stacklayout vorschreibt: Stackinhalt Beispiel(ab Adresse 0xffffd6b0) Funktionsparameter : 0x10022009 Rücksprungadresse in die aufrufende Funktion: 0x080483d2 zeiger auf den vorigen stackframe: 0xffffd6b8 lokale variablen: 0x09122008 ich soll jetzt die rücksprungadressen die der stack enthält, kann mir bitte einer hierbei helfen Zitieren
Crush Geschrieben 29. November 2008 Geschrieben 29. November 2008 Zuerst mal zu Deiner Fragestellung: Rücksprungadresse in die aufrufende Funktion: 0x080483d2 lokale variablen: 0x09122008 ich soll jetzt die rücksprungadressen die der stack enthält, kann mir bitte einer hierbei helfen-> Wo ist denn hier nun die Frage? Falls Du die Rücksprungadresse wissen willst, die hast Du ja schon oben stehen? Vermutlich willst Du wissen, wie Du vom Stackframe auf alle Rücksprungadressen schliessen kannst`. Ich gehe einfach mal von dieser Fragestellung aus: ich soll jetzt die rücksprungadressen die der stack enthält, kann mir bitte einer hierbei helfen Das ist nicht ganz so einfach zu sagen, was Du wissen willst. Auf dem fixen Stack werden vom Prozessor vom Ende (höchste Adresse) Richtung Anfang (niedriegste Adresse) Daten wie Prozessorregister, Rücksprungadresse und evtl. Übergabeparameter abgelegt. Wie diese abgelegt werden, ist durch ein paar Standard-Aufrufkonventionen definiert. Es gibt den Fastcall, den Standardcall, die C-Declaration oder nach Wunsch auch einen "nackten" call, den man selber definieren kann. Es müssen also nicht immer alle Variablen abgelegt werden, sondern durch Compileroptimierungen ist es möglich, dass einige Variablen in Registern übergeben werden und nicht über den Stack. Wieviel bei jeder aufgerufenen Funktion wieder "zurückgerollt" werden muss, weiss nur die Funktion selbst und macht dies beim Rücksprung. Ich gehe mal von der CDeclaration aus, dann muss in der höchsten vorhandenen Adresse (nach Aufaddieren der Parameter) die Rücksprungadresse stehen. Diese einzeln abzufragen ist praktisch nicht möglich, weil diese bei Verschachtelungen einfach hintereinander abgelegt werden. Die einzige zuverlässige Adresse, die Du erhalten kannst, ist der start des Stacks, welcher bei Intel-Prozessoren im Register EBP (das ist der Framezeiger) steht. Alles was danach kommt, ist ein verfolgen der Stackaufrufe durch das Programm, was bei jedem Ablauf unterschiedlich sein kann. Ein Auslesen aller Rücksprungadressen ist also nicht ohne Zusatzinformationen möglich. Es geht eigentlich nur, wenn Du einen Debugger im Trace-Mode die Adressen tracken und sammeln lässt. In manchen Sprachen gibt es Diagnose-Routinen, die anstatt des normalen Calls aufgerufen werden und diese Aufgabe dann übernehmen. Zitieren
e.full Geschrieben 29. November 2008 Autor Geschrieben 29. November 2008 ja die aufgabe kommt mir auch merkwürdig vor. das habe ich mir auch gedacht. das war so in einer tabelle abgebildet.und die aufgabe lautet nennen sie die rücksprungadressen die der stack enthält. dann kommt noch die frage: nennen sie die parameter die bei den funktionsaufrufen übergeben werden. und drittens welchen fehler hat der programmierer vermutlich gemacht. ich verstehe auch nicht den zusammenhang? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.