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