Springen naar inhoud

Call Stack


  • Log in om te kunnen reageren

#1

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 15 november 2012 - 18:24

Hey,

Ik weet niet hoe ik deze oefening moet oplossen.
Zou iemand me kunnen helpen?

Call_Stack.png

Dank bij voorbaat,
Roger

Veranderd door Xenion, 16 november 2012 - 09:55
afbeelding in bericht toegevoegd


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

jhnbk

    jhnbk


  • >5k berichten
  • 6905 berichten
  • VIP

Geplaatst op 15 november 2012 - 18:55

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.

Veranderd door jhnbk, 15 november 2012 - 18:57

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.

#3

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 15 november 2012 - 19:01

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

#4

Xenion

    Xenion


  • >1k berichten
  • 2606 berichten
  • Moderator

Geplaatst op 16 november 2012 - 10:00

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.

Verborgen inhoud
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.

#5

Energyfellow

    Energyfellow


  • >100 berichten
  • 122 berichten
  • Ervaren gebruiker

Geplaatst op 16 november 2012 - 11:21

Bedankt, ik versta het inderdaad al wat beter.





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures