Page 3 of 4

Posted: Sun Jan 07, 2007 7:40 pm
by dr_b
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

Posted: Sun Jan 07, 2007 7:45 pm
by Nickman
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?

Posted: Sun Jan 07, 2007 7:51 pm
by dr_b
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.

Posted: Sun Jan 07, 2007 8:07 pm
by cG`
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 :|

Posted: Sun Jan 07, 2007 8:12 pm
by dr_b
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 ...

Posted: Sun Jan 07, 2007 8:23 pm
by dr_b
stelt die witregel dan mss de waarde van die pc voor ?

Posted: Sun Jan 07, 2007 8:52 pm
by Michael Cochez
Dat was mijn conclusie ook

Posted: Sun Jan 07, 2007 11:05 pm
by Adelbert
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?

Posted: Mon Jan 08, 2007 12:00 am
by Nickman
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.

;)

Posted: Mon Jan 08, 2007 12:05 am
by Chatora
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:

Posted: Mon Jan 08, 2007 12:16 am
by Nickman
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

Posted: Mon Jan 08, 2007 1:09 pm
by EagleEye812
zarry wrote:wickaaaah! thcikci tschiki paaaauuuuw wicked-original!
:D


anyway, hoe was het examen ?? anyone :)

Posted: Mon Jan 08, 2007 2:23 pm
by Nick
awesome, kzie het rooskleurig in :)

Posted: Mon Jan 08, 2007 2:24 pm
by slimmy
Hoera voor woef! :D

Posted: Mon Jan 08, 2007 5:41 pm
by zarry
exaam was
zarry wrote:wickaaaah! thcikci tschiki paaaauuuuw wicked-original!
ook wegens moelekheidsgraad 4 op 10.. Jieeee Jaques Cousteau