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..]