Programmeren in TI-83+ Assembly/Registers en procedures/De instructies call en ret: verschil tussen versies

Uit Wikibooks
Verwijderde inhoud Toegevoegde inhoud
Willem1 (overleg | bijdragen)
nieuwe pagina over call en ret
(geen verschil)

Versie van 27 dec 2009 15:21

Programmeren in TI-83+ Assembly

Voorblad / Inhoudsopgave

Assembly-basis

1 · 2 · 3 · 4 · 5 · T

Controle

1 · 2 · 3 · 4 · 5 · T

Geheugenbeheer

1 · 2 · 3 · 4 · 5 · T

Input en output

1 · 2 · 3 · 4 · 5 · T

Tekenen

1 · 2 · 3 · 4 · 5 · T

Registers en procedures

1 · 2 · 3 · 4 · 5 · T

Applications

1 · 2 · 3 · 4 · T

Gebruikersvariabelen

1 · T

Extra

1 · T

Speciaal

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

Als 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

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

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.