Programmeren in TI-83+ Assembly/Registers en procedures/De instructies call en ret
De instructies call en ret ken je al:
- call springt naar een label. Het verschil met jp en jr is dat je, als je call gebruikt, terug kunt gaan met ret.
- ret gaat terug naar de bijbehorende call-instructie, of naar het TI-OS.
Wat call en ret eigenlijk doen
bewerkenAls je call aanspreekt, dan moet er natuurlijk worden onthouden waarnaartoe terug moet worden gesprongen als ret wordt gebruikt. De processor gebruikt hiervoor de stack. Als je call gebruikt, dan gebeurt er dus hetzelfde als jp, met als extra bijkomstigheid dat het huidige geheugenadres op de stack wordt gelegd. Als je ret gebruikt, dan wordt het bovenste element van de stack genomen en dan wordt daarnaartoe gesprongen.
Subroutines en de stack
bewerkenAls je een subroutine gaat schrijven, dan moet de stack dus hetzelfde blijven. Stel je het volgende stukje code voor:
call Subroutine ret Subroutine: ld af, $1390 push af ret
De uitvoering verloopt als volgt.
- Als eerste wordt er naar Subroutine gesprongen. Het adres van de call-instructie wordt opgeslagen in de stack.
- De subroutine verandert de stack.
- Er wordt teruggesprongen naar het bovenste adres op de stack. Dit adres is echter veranderd in $1390! Het gevolg is dat de uitvoering op de verkeerde plek verder gaat, waardoor er een zeer grote kans is op een crash.
Ditzelfde geldt ook voor het gehele programma. De TI-OS gebruikt ook een vorm van call om het programma te beginnen. Daarom moet je ook met ret weer terug naar de TI-OS. Als de stack tijdens het programma veranderd is, dan springt de uitvoering naar een andere plaats. Dat is dus de reden dat je ervoor moet zorgen dat de stack voor en na het programma hetzelfde blijft.