Page 1 of 4

[Prog] extra info Run-time Stack?

Posted: Wed Jan 03, 2007 7:54 pm
by zarry
wtf?! :shock:
wa een kut informatie is er rond dees, iemand da daar nen deftigen uitleg over heeft want die slides die zeggen geen k****!
ik was wel in die les maarja.. ge kent da *geeuw*.. had geen papier bij en ben al vergeten wa die daarover te zegge had. :roll:
jieeee en mercieeee

Posted: Wed Jan 03, 2007 11:24 pm
by Nick
kben nooit goed in zoiet uitleggen,
maar doe zoals mij, en gebruik de 2 beste vrienden van de mens: Google en Wikipedia (Call Stack)

Met wat chance is er wel iemand op dit forum die de uitleg hier wilt doen :)

Posted: Thu Jan 04, 2007 12:12 am
by Norfolk
Actual Call Basics
- Push actuele parameters
- Push PC
- Push BP
- Copy SP to BP
- Allocate local space

Return Basics
- Copy BP to SP
- Pop old BP to BP
- Pop Returnaddress to PC
- Pop parameter space
Dit is wat je zeker moet begrijpen.
Bij een functie oproep zal vanalles op de stack gezet worden. Bij het returnen van de functie, zal alles van de stack gehaald worden, zodat je terug op het vorige niveau zit.

Bij een oproep zal je dus eerst alle actuele parameters pushen. Hierdoor zal de functie die opgeroepen wordt, aan de waarden van de actuele parameters kunnen raken.
Als er by reference wordt doorgegeven zal er een pointer op de stack gezet worden in plaats van een kopie van de waarde.
Na deze actuele parameters wordt de PC (Program Counter) op de stack gepushed. Dit is nodig om bij het returnen te weten waar je zat.
Ook de huidige BP (Base Pointer) wordt op de stack gezet. Dit om te zien waar het vorige niveau staat op de stack. (Dit zorgt voor oneigenlijk stackpeecking omdat je dan niet meer enkel push/pop doet). Door deze BP kan je dus naar hogere niveau's springen en dus globale variabelen steeds blijven zien.
Dan wordt de SP (Stack Pointer) gekopieerd naar de BP. Om het nieuwe niveau aan te duiden.
En dan worden alle lokale variabelen ook op de stack geplaatst. Dit omdat je anders bij een functie oproep in deze functie, de lokale variabelen niet zou kunnen zien.


Bij het terugkeren van de functie wordt dit alles natuurlijk omgekeerd, en terug naar voor de functie oproep hersteld.
Je haalt lokale variablen van de stack aangezien je die niet meer nodig hebt.
Je hersteld BP naar waarde voor oproep, hetzelfde voor SP.
En je haalt alle parameters die op de stack gepushed werden om de functie oproep tot stand te brengen, er terug af.



Je kreeg zo'n oefeningen blad daarbij. (Wij kregen dat toch vorig jaar)
Je moet dat eens goed bezien, met wat hier staat in het achterhoofd. Zie dat je alles wat daar gebeurd, goed begrijpt. En voor de rest staat alles wat je moet weten wel in de cursus.

Posted: Thu Jan 04, 2007 12:19 am
by Nick
Norfolk wrote: Je kreeg zo'n oefeningen blad daarbij. (Wij kregen dat toch vorig jaar)
Info - Is voor de 1ste BACers ook beschikbaar gemaakt via blackboard

Posted: Thu Jan 04, 2007 12:32 am
by zarry
Norfolk wrote:
Actual Call Basics
- Push actuele parameters
- Push PC
- Push BP
- Copy SP to BP
- Allocate local space

Return Basics
- Copy BP to SP
- Pop old BP to BP
- Pop Returnaddress to PC
- Pop parameter space
Dit is wat je zeker moet begrijpen.
Bij een functie oproep zal vanalles op de stack gezet worden. Bij het returnen van de functie, zal alles van de stack gehaald worden, zodat je terug op het vorige niveau zit.

Bij een oproep zal je dus eerst alle actuele parameters pushen. Hierdoor zal de functie die opgeroepen wordt, aan de waarden van de actuele parameters kunnen raken.
Als er by reference wordt doorgegeven zal er een pointer op de stack gezet worden in plaats van een kopie van de waarde.
Na deze actuele parameters wordt de PC (Program Counter) op de stack gepushed. Dit is nodig om bij het returnen te weten waar je zat.
Ook de huidige BP (Base Pointer) wordt op de stack gezet. Dit om te zien waar het vorige niveau staat op de stack. (Dit zorgt voor oneigenlijk stackpeecking omdat je dan niet meer enkel push/pop doet). Door deze BP kan je dus naar hogere niveau's springen en dus globale variabelen steeds blijven zien.
Dan wordt de SP (Stack Pointer) gekopieerd naar de BP. Om het nieuwe niveau aan te duiden.
En dan worden alle lokale variabelen ook op de stack geplaatst. Dit omdat je anders bij een functie oproep in deze functie, de lokale variabelen niet zou kunnen zien.


Bij het terugkeren van de functie wordt dit alles natuurlijk omgekeerd, en terug naar voor de functie oproep hersteld.
Je haalt lokale variablen van de stack aangezien je die niet meer nodig hebt.
Je hersteld BP naar waarde voor oproep, hetzelfde voor SP.
En je haalt alle parameters die op de stack gepushed werden om de functie oproep tot stand te brengen, er terug af.



Je kreeg zo'n oefeningen blad daarbij. (Wij kregen dat toch vorig jaar)
Je moet dat eens goed bezien, met wat hier staat in het achterhoofd. Zie dat je alles wat daar gebeurd, goed begrijpt. En voor de rest staat alles wat je moet weten wel in de cursus.
Nen dikken mercie voor al die moeite :lol: en ja da blad en die module kheb die info uit proberen te vissen maar da lukte ni al te goe maar nu komt da wel in orde! En de info dak von op google was zo 1000 jaar lang :D dermee dak et ff vroeg :) wiki was ik -schaam op mij- vergeten te checke ma normaal doe google da wel als er iets goed van te vinde is ;)
Jie

Posted: Thu Jan 04, 2007 12:37 am
by zarry
ik heb gewoon dezelfde quote als u ma dan woef = zwan :) dammit, kmoe nen andere hebbe :D

Posted: Thu Jan 04, 2007 12:43 am
by Norfolk
zarry wrote:ik heb gewoon dezelfde quote als u ma dan woef = zwan :) dammit, kmoe nen andere hebbe :D
lol wtf?

anyway, graag gedaan :)

Posted: Thu Jan 04, 2007 12:51 am
by Nick
zarry wrote:ik heb gewoon dezelfde quote als u ma dan woef = zwan :) dammit, kmoe nen andere hebbe :D
yea wtf? :D
you lost me here.

en ja, wikipedia kent precies enkel "Call Stack", wat blijkbaar synoniem is aan run-time stack

Posted: Thu Jan 04, 2007 1:45 am
by zarry
To Woef or not to Woef
To Zwan Or Not To Zwan.. :)
Ma er sta nu iet anders e ;)

Enja ik wist da ni van die call :) Jiee

Posted: Thu Jan 04, 2007 1:55 am
by cG`
barry tamzak :p

*edit* me = carlo dus :D

Posted: Thu Jan 04, 2007 2:48 am
by zarry
cG` wrote:barry tamzak :p

*edit* me = carlo dus :D
Ja da is

Posted: Thu Jan 04, 2007 4:05 am
by zarry
*vreugdedans* ik snap het volledig merci voor de hulp e :D wickaaaah! thcikci tschiki paaaauuuuw wicked-original! Eigenlijk is da helemaal ni zo moelek e.. Maar toch :)

Posted: Sun Jan 07, 2007 10:49 am
by Teun
Hoe worden de returnwaardes bij functieprocedures dan doorgegeven? Logisch zou zijn op dezelfde manier als bijvoorbeeld variabele parameters?

Posted: Sun Jan 07, 2007 10:53 am
by Norfolk
Teun wrote:Hoe worden de returnwaardes bij functieprocedures dan doorgegeven? Logisch zou zijn op dezelfde manier als bijvoorbeeld variabele parameters?
Het hele object wordt op de stack gezet. Dus als het een integer is, dan wordt er de waarde van de integer op de stack gezet. Dus geen pointer zoals bij variabele parameters.

Posted: Sun Jan 07, 2007 11:41 am
by Teun
Ik bedoel bij het aflopen van een procedure.

Stel

PROCEDUE Doeietsnuttigs(VAR par1, par2):INTEGER;

Hoe de par1 en 2 doorgegeven worden snap ik, maar hoe wordt de INTEGER dan teruggeven naar de procedure die Doeietsnuttigs oproept?

Wordt er bij de oproepprocedure al een variabele'x' aangemaakt die de waarde moet krijgen van de return-INTEGER?

En wordt er dan bij het oproepen van doeietsnuttigs een pointer naar die waarde'x' meegegeven, zodat Doeietsuttigs 'x' kan overschrijven?

Dat lijkt me een zinnige oplossing?