Gebruikersavatar
Energyfellow
Artikelen: 0
Berichten: 122
Lid geworden op: zo 30 sep 2012, 12:01

Call Stack

Hey,

Ik weet niet hoe ik deze oefening moet oplossen.

Zou iemand me kunnen helpen?
Call_Stack
Call_Stack 443 keer bekeken
Dank bij voorbaat,

Roger
Gebruikersavatar
jhnbk
Artikelen: 0
Berichten: 6.905
Lid geworden op: za 16 dec 2006, 09:10

Re: Call Stack

Probeer eerst eens zelf een oplossing te verzinnen. Hint: deel het programma op in ondeelbare blokken.

EDIT: of zet pijltjes van lijn naar lijn die de CALL en RET statements aangeven.
Het vel van de beer kunnen verkopen vraagt moeite tenzij deze dood voor je neervalt. Die kans is echter klein dus moeten we zelf moeite doen.
Gebruikersavatar
Energyfellow
Artikelen: 0
Berichten: 122
Lid geworden op: zo 30 sep 2012, 12:01

Re: Call Stack

Jhnbk,

Volgens mij is het zo: CALL y roept de w aan, dus zien we van onder een w.

Dan hebben we y PUSH R0, die zal dus een R0 weergeven, dus krijgen we dan R0.

Dan de Call z zal de volgende instructie aanroepen, in dit geval x instr, dus het volgende is dan x.

Als laatste hebben we dan de z PUSH R0, die zal dus de R1 weergeven.

Is deze redenering juist?

Indien ja, wat doe je dan met RET, POP R0?

Dank bij voorbaat,

Roger
Gebruikersavatar
Xenion
Artikelen: 0
Berichten: 2.609
Lid geworden op: za 21 jun 2008, 10:41

Re: Call Stack

De oplossing staat er toch gewoon naast? Volgens mij begrijp je niet hoe subroutine calls werken. CALL y roept niet w aan, maar y.

Bij een CALL wordt het adres van de volgende functie op de stack gepushed. Dit is het return address zodat je achteraf weet waar je instructiepointer naar moet wijzen na het uitvoeren van de functie.

Na die push springt de IP naar het adres van de functie en begint daar gewoon het programma verder uit te voeren. Als de IP aan RET komt, dan wordt het return adres van de stack gepopt en wordt springt de IP daar naartoe.

In jouw oefening ben je op het moment dat de IP aan de blauwe pijl staat nog geen RET tegengekomen.
Spoiler: [+]
Uitleg van de oplossing:

Stack is initieel leeg.

Bij CALL y wordt het adres van de volgende instructie op de stack geplaatst: w

De jump naar y wordt gemaakt en in y wordt R0 op de stack geplaatst.

Er is een CALL naar z, dus wordt weer het adres van de volgende instructie op de stack geplaatst: x

De jump naar z wordt gemaakt en in z wordt R1 op de stack geplaatst.

De instructiepointer staat op dit moment op de plaats van de blauwe pijl.
Gebruikersavatar
Energyfellow
Artikelen: 0
Berichten: 122
Lid geworden op: zo 30 sep 2012, 12:01

Re: Call Stack

Bedankt, ik versta het inderdaad al wat beter.

Terug naar “Informatica en programmeren”