Page 1 of 1

[CS] stack- en framepointers

Posted: Tue Dec 11, 2012 10:00 pm
by Flipper
Is er iemand die me het verschil tussen een stackpointer en een framepointer kan uitleggen? Ik heb die verschillen helemaal niet goed door.. :(

Ik probeer ook al een frame te tekenen op papier, maar...

Image

Re: [CS] stack- en framepointers

Posted: Wed Dec 12, 2012 7:32 am
by Disparv
Stackpointer wijst naar de top van de stack, en de framepointer wijst naar de scope boven de functie die opgeroepen is. Dus als ge een functie recursief oproept blijft de framepointer naar hetzelfde wijzen, maar de stackpointer niet.

Re: [CS] stack- en framepointers

Posted: Wed Dec 12, 2012 7:15 pm
by Flipper
Disparv wrote:Stackpointer wijst naar de top van de stack, en de framepointer wijst naar de scope boven de functie die opgeroepen is. Dus als ge een functie recursief oproept blijft de framepointer naar hetzelfde wijzen, maar de stackpointer niet.
Niet helemaal juist, ik heb het aan professor Vangheluwe gevraagd en het is me nu al veel duidelijker geworden:

De stackpointer wijst naar de top van de stack (of net er boven, het is maar hoe je het zelf wilt). De stackpointer wijst steeds naar de huidige statement (dat kan vb. een add zijn, of een call naar een andere fuctie.). Na het uitvoeren van de statement gaat de stackpointer dus naar het volgende statement in de stack frame (het zogenaamd "pop" eigenlijk).

De framepointer wijst naar de huidige functie die opgeroepen is (vb. Fibonacci(5) ), wanneer een andere functie (vb. Factorial(12) om maar wat te verzinnen) wordt opgeroepen, zal de framepointer dus naar die functie wijzen. In die zin is de framepointer minder "nerveuzer" (dixit Vangheluwe) dan de stackpointer. (want de stackpointer verandert steeds statement per statement, de framepointer verandert pas per functie (en een functie kan wel meerdere statements tellen) ).

Het is dus niet correct dat de framepointer wijst naar de scope boven de functie (dan heb je het over de dynamic/static linker).

Ook dat de framepointer naar hetzelfde wijst in geval van recursieve oproepen is niet correct. (ik heb dat ook gevraagd aan Vangheluwe) De framepointer verandert wel degelijk wanneer een recursieve oproep wordt gedaan (de framepointer zal dan wijzen naar de zojuist opgeroepen functie). Je kunt dus de body van een functie (ongeacht dat dit recursief is) en zijn argumenten en return zien als één frame (vandaar frame pointer).


[Om er nog een extra verhaal aan te breien, heeft professor Vangheluwe me nog weten te vertellen dat een framepointer eigenlijk niet echt nodig is, je kan dus best wel zonder, maar het kan voor ons een handig hulpmiddeltje zijn..]

Re: [CS] stack- en framepointers

Posted: Wed Dec 12, 2012 10:00 pm
by djgl3nn
Stackpointer wijst altijd naar de huidige top of the stack, niet echt naar de huidige statement, das eerder de program counter.

Frame pointer wijst naar het begin van de huidige frame. De static link, wijst naar de frame van de enclosing procedure. (Dus recursieve frames hebben allemaal dezelfde static link, namelijk die van de laatste gecallde enclosing procedure.)

Dynamic link wijst altijd naar de frame van de procedure die de huidige procedure heeft gecallt.
(In die zin, als ge een nieuwe functie oproept, en dus een nieuwe frame aanmaakt, kunt ge de huidige framepointer gewoon in de dynamic link steken van de nieuwe frame, en dan de framepointer aanpassen. Dan heeft die wel iet of wa nut.)

De static link is nodig om de waarden van globale variabelen op te vragen, de dynamic link kan gebruikt worden om de frame pointer te herstellen na poppen.