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.