Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Wie verhält sich der Stack bei einem rekursiven Algorith

  Alt 23. Feb 2007, 14:13
Auf dem Stack liegen erstmal grundsätzlich:
-(alle) Übergabeparameter
-(alle) lokale Variablen, und zwar von jeder Instanz
-irgendwelche geretteten Register (meist mindestens ebp und esi)
-bei jedem Aufruf einer Funktion, die Rücksprungadresse

ausgleichend kann man noch sagen, dass im Zuge der Optimierung (bzw. aus anderen Gründen) manche Variablen/Übergabeparameter nie auf dem Stack landen, sondern in Registern gehalten werden. Dass erhöht die Zugriffsgeschwindigkeit, allerdings hat man in umfangreichen Funktionen selten Register übrig. Und Delphi übergibt die ersten 3 Parameter einer Funktion immer in Registern (siehe Aufrufkonvention register; C macht das z.B. nicht; hat vor- und nachteile)

Weiterhin gibt es Variablen, die größer sind als 1 Platz im Stack, alos alles was größer als 4 Bytes ist (Strings, Arrays und Records z.B.). Die liegen irgendwo im Speicher (können auch im "Stackbereich" der Funktion liegen, die z.B. den Record angelegt hat) und es wird nur mit Zeigern darauf gearbeitet. Bei einem String ist das generell so, der leigt irgendwo auf dem Heap und in deiner lokalen Variable liegt nur der Zeiger (4 Bytes). So, dann gibts noch die Möglichkeit, Werte im Stack der FPU zu speichern, was im gelegentlich für Fließkommazahlen gemacht wird.

Wenn du es mal genau für deine Funktion wissen willst dann debugge sie doch mal und drücke Strg+Alt+C.


Am Auszug deiner Funktion würde ich jetzt mal vermuten (muss aber nicht sein), dass jede Instanz von TTR min 8*4Bytes benötigt:
-Rücksprungadresse
-Rettung von ebp,esi und edi (ebp:Zeiger für lokale Variablen, esi und edi wird für Stringoperationen benötigt
-Adresse auf s
-Adresse auf anfang
-Adresse auf ende
-result (was auch immer das jetzt ist)
Allerdings könnte es sein, dass ein Strinzeiger in esi gehalten wird. Das kommt letztenendes auf den Compiler an. Wie gesagt schau es dir doch einfach mal an!
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat