[Prog] extra info Run-time Stack?

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

User avatar
Nickman
Posts: 391
Contact:

Post#16 » Sun Jan 07, 2007 2:20 pm

Teun wrote: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?
Als ge het in stack verband wilt weten:
Die return waarde wordt gewoon als laatste element op de stack gepushed vlak voordat de procedure gaat eindigen.
Als je dan terug in de opropende procedure komt (daar heb je iets zoals x = Doeietsnuttigs(1, 2); geschreven) dan zal die terugkeerwaarde van de stack gepopt worden in u x.

Snappy? :)
Webmaster of http://www.bwf.be
Make it idiot proof and someone will make a better idiot!

[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

Teun
Posts: 216

Post#17 » Sun Jan 07, 2007 3:12 pm

Hoe wordt die terugkeerwaarde dan juist in de x gepopt? Hoe jij het uitlegt (over beter: hoe ik je uitleg begrijp) wordt die reurnwaarde pas op de x gezet, nadat ze er al is fgehaald. En dat kan niet?
Kan je dt verduidelijken ajb?

User avatar
Nickman
Posts: 391
Contact:

Post#18 » Sun Jan 07, 2007 3:27 pm

Nee, niet echt...
Ik zal nog is proberen :p

Code: Select all

PROCEDURE Blah(VAR int1, int2 : INTERGER) : INTEGER;
BEGIN
     RETURN (int1 + int2);
END Blah;

PROCEDURE Test();
     VAR
          a, b, c : INTEGER;
BEGIN
     a = 5;
     b = 3;
     c = Blah(a, b);  (* c = 5 + 3 = 8 *)
END Test;
Je doet dus de functie oproep "Blah(a, b)"

Wat hierbij eigenlijk zal gebeuren is het volgende:
De waardes van a en b (5 en 3 respectievelijk) zullen eerst op de stak geplaatst worden voordat die procedure opgeroepen wordt.
Dan gebeurd de procedure call en daar kan met dus aan deze waarde door een offset te gebruiken vanaf de nieuwe base pointer.

Nu het enige dat daar zal gebeuren is dat a + b zal uitgerekend worden, dit zal resulteren in 8.
Nu worde alles éérst terug van de stack gepopt (dus alle local variabelen enz.) en ook die twee parameters die je voor de oproep er had opgeplaatst zullen van de stack gepopt worden.

Nu voor de procedure gaat terugkeren naar de oproepende procedure zal deze "8" op de stack worden gepushed.

De procedure keert terug naar de oproepende procedure en in deze oproepende procedure zal die 8 er terug af gepopt worden en in de juiste variabele "c" gestoken worden.
Webmaster of http://www.bwf.be
Make it idiot proof and someone will make a better idiot!

[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

User avatar
cG`
Posts: 75

Post#19 » Sun Jan 07, 2007 3:59 pm

Merci Nickman

Teun
Posts: 216

Post#20 » Sun Jan 07, 2007 5:44 pm

Ah, duidelijk.

Zoen!

User avatar
Nickman
Posts: 391
Contact:

Post#21 » Sun Jan 07, 2007 6:44 pm

np ;)

wickaaaah! thcikci tschiki paaaauuuuw wicked-original!
Webmaster of http://www.bwf.be
Make it idiot proof and someone will make a better idiot!

[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

dr_b
Posts: 25
Contact:

Post#22 » Sun Jan 07, 2007 6:54 pm

long time no see... (ik lees wel dikwijls, maar schrijf meestal ni zo veel, ge kent da wel)

maar toch, nog een snelle vraag over die runtime stack...
Ik snap het hele boeltje nu wel, ik zie alleen niet echt in waar die PC dan wel staat op die stack. En begrijp ook ni echt hoe het komt da der overal whitespace tss staat op den arickx zijn voorbeelden ...

hopelijk kunne jullie mij nog helpen, thx

greetz,
JOris

Jerre
Posts: 22

Post#23 » Sun Jan 07, 2007 7:06 pm

PC: program counter, staat in zekere zin los van de stak, laat me even een simpel voorbeel geven:
PC | taak
0 doe ding 1
1 doe ding 2
2 doe ding 3

PC dus houdt de volgorde van taken bijµ

Nu die witregels, ik vermoed dat je die hele rijen bedoelt?
Dat zijn plaatsen waar returntypes moeten komen, die we dus nog niet weten

User avatar
zarry
Posts: 212

Post#24 » Sun Jan 07, 2007 7:07 pm

dr_b wrote:hoe het komt da der overal whitespace tss staat op den arickx zijn voorbeelden ...
zie uitleg van in 't begin, na actuele oproep en die waarden op stack te zetten gebeurt er ne push ofzoiet voor tgeen da die kerel boven mij zegt :) Jie
Ik spreek Zwarryzwaniaans en jij?

dr_b
Posts: 25
Contact:

Post#25 » Sun Jan 07, 2007 7:12 pm


PC: program counter, staat in zekere zin los van de stak, laat me even een simpel voorbeel geven:
PC | taak
0 doe ding 1
1 doe ding 2
2 doe ding 3

PC dus houdt de volgorde van taken bij
Ok, dat begrijp ik in principe wel, maar waar wordt die dan gepushed op de stack ? want hij staat toch in dat rijtje ? kan je mss iets anders uitleggen ?

Thx

@zarry, gaan da dan direct eens herleze, eerst ff ete
laters

User avatar
Nickman
Posts: 391
Contact:

Post#26 » Sun Jan 07, 2007 7:13 pm

Misschien kunde die voorbeelden van den Arickx is posten, dan kannek misschien zeggen waarvoor die whitespaces dienen ;)
Webmaster of http://www.bwf.be
Make it idiot proof and someone will make a better idiot!

[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

User avatar
cG`
Posts: 75

Post#27 » Sun Jan 07, 2007 7:24 pm

Nickman wrote:Misschien kunde die voorbeelden van den Arickx is posten, dan kannek misschien zeggen waarvoor die whitespaces dienen ;)
et voila:
http://users.skynet.be/hosting/StackTest.pdf
http://users.skynet.be/hosting/StackTest.Arc
Last edited by cG` on Sun Jan 07, 2007 7:35 pm, edited 1 time in total.

User avatar
Nickman
Posts: 391
Contact:

Post#28 » Sun Jan 07, 2007 7:27 pm

En bijhorende functies... :p
Webmaster of http://www.bwf.be
Make it idiot proof and someone will make a better idiot!

[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

User avatar
Norfolk
WOZ
Posts: 780
Contact:

Post#29 » Sun Jan 07, 2007 7:28 pm

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.
De PC houdt huidige lijn in de code bij. (In de binaire code dan). Bij een functie oproep maak je dus een sprong in de code naar waar de functie gedefinieerd staat (implementatie van functie). Dus de PC veranderd naar waar de functie staat. Als je dan nergens de vorige waarde van de PC (dus waar je was voor de functie oproep), dan weet je niet naar waar je terug moet springen na het uitvoeren van de functie.

User avatar
cG`
Posts: 75

Post#30 » Sun Jan 07, 2007 7:35 pm

Arc file met code staat erbij nu :)

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 5 guests

cron