[Prog] extra info Run-time Stack?

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

dr_b
Posts: 25
Contact:

Post#31 » Sun Jan 07, 2007 7:40 pm

schiet me nu dood he, maar ik ben toch niet helemaal mee. Ik begrijp echt wel waarvoor die pc dient enzo, maar ik zien hem niet staan op de stack ...

laat me het verduidelijken...

als je er even pagina 2 van RX' voorbeeld wilt bijnemen (http://users.skynet.be/hosting/StackTest.pdf)

en dat dan vergelijkt me die stappen (te beginnen bij adres 0090F7BC)

- Push actuele parameters
---------------------------
0090F7BC waarde van a (wde par)
0090F7B8 waarde van b (var par)

- Push PC
------------
waar staat da beest ?, wat doet die lege regel hier ?

- Push BP
------------
0090F7B0 OLD BP

- Copy SP to BP
----------------
verplaatsen stack ptr

- Allocate local space
-----------------------
0090F7AC waarde van j , waarde van i

alvast elen dikke merci

grtz,
Joris

User avatar
Nickman
Posts: 391
Contact:

Post#32 » Sun Jan 07, 2007 7:45 pm

cG` wrote:Arc file met code staat erbij nu :)
sorry, maar oberon staat niet meer op mijn PC :D, zet ze even in een CODE veldje hier?
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#33 » Sun Jan 07, 2007 7:51 pm

sorry, maar oberon staat niet meer op mijn PC Very Happy, zet ze even in een CODE veldje hier?
u vraagt, wij draaien ...

Code: Select all

MODULE StackTest;
  IMPORT OutExt, SYSTEM;
  
  TYPE Arr = ARRAY 10 OF CHAR;
   VAR
    y: LONGINT;
    z: Arr;
  PROCEDURE Een(a: REAL; VAR b: Arr);
    VAR i, j: INTEGER;

     PROCEDURE Twee(VAR u: REAL; v: Arr);
      VAR w: LONGINT;
     BEGIN
     END Twee;

   BEGIN
    IF y = 0 THEN
      y := 1;
      Een(a, b);
    END;
    Twee(a, b);
   END Een;

  PROCEDURE Doe*;
   VAR li: LONGINT;
  BEGIN
   Een(y, z);
  END Doe;

BEGIN
 y := 0;
END StackTest.

User avatar
cG`
Posts: 75

Post#34 » Sun Jan 07, 2007 8:07 pm

Hoe ik het "begrijp":
De PC wordt gepusht na de parameters en bevat de returnwaarde voor op het einde dus als het ware naar te returnen (inderdaad wonderbaarlijk). Ik veronderstel dat het returnadres ongeveer wijst naar de positie waar de caller-functie de callee-functie activeert. Bij afloop van de callee-functie zal naar dit adres gereturnt worden waardoor de uitvoering van het programma kan verder gaan waar het "onderbroken" werd door de oproep van de andere functie.

Kvind da ne vrij logische uitleg, maar correct me if I'm wrong :|

dr_b
Posts: 25
Contact:

Post#35 » Sun Jan 07, 2007 8:12 pm

ok, dat begrijp ik :)
maar, dan moet er toch ergens op die stack een waarde staan van die programcounter, niet ? en die zie ik niet echt staan ...

dr_b
Posts: 25
Contact:

Post#36 » Sun Jan 07, 2007 8:23 pm

stelt die witregel dan mss de waarde van die pc voor ?

Michael Cochez
Posts: 54

Post#37 » Sun Jan 07, 2007 8:52 pm

Dat was mijn conclusie ook

User avatar
Adelbert
Posts: 34

Post#38 » Sun Jan 07, 2007 11:05 pm

Nickman wrote: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.
Volges mij klopt da ni elemaal, want als die waarde wordt gepushed voorda de procedure is afgelopen, zal die waarde gewoon mee verwijdert worden samen met de rest door de return-basics.
Wa mij eerder logischer lijkt is da die waarde efkes erges anders wordt bijgehouden (in een extra register of zo, of erges op den heap of zo en dan wordt der ne pointer erges in een register gestoke) en dan wordt na de procedure alles terug braaf afgebroken, en de waarde die dan in da register of register^ sta wordt dan op de plaats van c gezet...
Of heb ik alles gewoon fout verstaan?

User avatar
Nickman
Posts: 391
Contact:

Post#39 » Mon Jan 08, 2007 12:00 am

Adelbert wrote:Volges mij klopt da ni elemaal, want als die waarde wordt gepushed voorda de procedure is afgelopen, zal die waarde gewoon mee verwijdert worden samen met de rest door de return-basics.
Wa mij eerder logischer lijkt is da die waarde efkes erges anders wordt bijgehouden (in een extra register of zo, of erges op den heap of zo en dan wordt der ne pointer erges in een register gestoke) en dan wordt na de procedure alles terug braaf afgebroken, en de waarde die dan in da register of register^ sta wordt dan op de plaats van c gezet...
Of heb ik alles gewoon fout verstaan?
Ik weet niet hoe Oberon alles exact regelt, maar in onze Assembly Marge Sort code die we moeste schrijven, moesten wij zelf die parameter doorgave schrijven elke keer, en naar mijn weten was de enige manier om dat veilig te doen op deze manier...

als je het zoals jij zegt via een extra register ofzo wil doen, hoe ga jij er dan zeker van zijn dat dat register nergens anders gebruikt wordt?

Het is ook de bedoeling om alle registers in een methode die je oproept te "backuppen" zodat je veilig alle registers kan gebruiken.
Aan het einde van deze methode ga je dan al die waardes van de registers die je gebackupt hebt, terug op hun originele locatie steken zodat je niet met de locale "variabelen" (registers dan) knoeit van je oproepende functie en dat je dus nergens per ongeluk het verloop kan verknoeien.

Jou manier van ergens een register te gaan gebruiken is dus geen veilige methode en de enige manier om een parameter terug te geven op een veilige manier is om deze op de top van de stack te laten staan.

Er zijn geen automatische "return-basics" of hoe je het wil noemen die standaard ingebouwd zijn om alles te verwijderen van de stack.
Dat maakt je compiler voor u, en dat zal op de manier die ik beschreven heb gebeuren aangezien dat de enige veilige manier is.

Hopelijk snap je het nu wel, anders post ik wel een stukje assembly om het duidelijk te maken ;).

greetz
-----------------
Er is inderdaad wel een klein foutje in mijn uitleg... (Tobias heeft me er op gewezen :D)

Je gaat de return parameter er niet als laatste op pushen aangezien je dan inderdaad je waarde niet meer hebt.

Je gaat ofwel een extra item reserveren in het begin van je opgeropen procedure (als je geen parameters mee gegeven zou hebben aan de functie). Ofwel ga je de return waarde in de eerst mee gegeven parameter steken.

Dan ga je eerst je returnwaarde op deze lokatie op de stack plaatsen (deze zit dus vlak boven het laatste element van de oproepende functie) en dan ga je alles er weer terug af poppen en op de juiste locatie zetten.

;)
Last edited by Nickman on Mon Jan 08, 2007 12:10 am, edited 1 time in total.
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
Chatora
Posts: 37

Post#40 » Mon Jan 08, 2007 12:05 am

Da klopt inderdaad niet helemaal.
Als ge eerst alles terug van de stack popt, zal uw register waar uw returnwaarde in zit overschreven worden met zijn oorspronkelijke waarde.

Wanneer uw functie wordt opgeroepen met enkele parameters, kunt ge op het einde van uw functie uw return waarde gewoon op de plaats van de eerste parameter bewaren, en dan pas de rest eraf poppen.
Zo houdt ge dus 1 plaatske over op uw stack, die ge deraf kunt poppen in uw aanroepende procedure.


Als uw functie geen parameters meekrijgt kunt ge het zo oplossen:
Ge reserveert helemaal aan het begin van uw functie een plaatske op de stack voor uw return waarde, en dan pas pusht ge alles daar bovenop.
Opt einde moet ge op uw gereserveerde plaats uw returnwaarde opslaan en dan pas al de rest van uw stack poppen. zodat uw registers terug hun originele waarden hebben.
Op dat moment zit uw returnwaarde dus bovenaan op de resterende stack, en kan die er in de oproepende procedure makkelijk afgepopt worden.



*EDIT*
Nick gij se vuilen editer! :twisted:

User avatar
Nickman
Posts: 391
Contact:

Post#41 » Mon Jan 08, 2007 12:16 am

Ik had u post nog ni gezien, kwist ni da gij gereplyed had :D

En ik heb u toch credit gegeven voor de foutoplossing ;).

So, what's the problem my friend? :D
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
EagleEye812
Posts: 406

Post#42 » Mon Jan 08, 2007 1:09 pm

zarry wrote:wickaaaah! thcikci tschiki paaaauuuuw wicked-original!
:D


anyway, hoe was het examen ?? anyone :)
[quote="zarry"][url=http://www.winak.be/forum/viewtopic.php?p=12475#12475]wickaaaah! thcikci tschiki paaaauuuuw wicked-original![/url][/quote]

User avatar
Nick
Prosenior
Posts: 1850
Contact:

Post#43 » Mon Jan 08, 2007 2:23 pm

awesome, kzie het rooskleurig in :)
To Woef or not to Woef, that is the question!

WINAK Scriptor 2006-2007
WINAK Vice-Praeses 2007-2008
WINAK Praeses 2008-2009
WINAK Cantor 2009-2010
... en kortom: Eeuwig WINAKer 8)

User avatar
slimmy
Prosenior
Posts: 3130
Contact:

Post#44 » Mon Jan 08, 2007 2:24 pm

Hoera voor woef! :D

User avatar
zarry
Posts: 212

Post#45 » Mon Jan 08, 2007 5:41 pm

exaam was
zarry wrote:wickaaaah! thcikci tschiki paaaauuuuw wicked-original!
ook wegens moelekheidsgraad 4 op 10.. Jieeee Jaques Cousteau
Ik spreek Zwarryzwaniaans en jij?

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 5 guests

cron