Programmeren in TI-83+ Assembly/Assembly-basis/De stack: verschil tussen versies
afbeeldingen naar onderen verplaatst om te voorkomen dat ze naast de inhoudsopgave kwamen te staan |
opdracht |
||
Regel 13: | Regel 13: | ||
===Een praktische toepassing=== |
===Een praktische toepassing=== |
||
Je weet al dat je er bij |
Je weet al dat je er bij bcalls vanuit moet gaan dat alle registers veranderd worden. Wil je a bijvoorbeeld bewaren, maar moet er een instructie uitgevoerd worden, kan dat eenvoudig met de stack: |
||
<pre> push af |
<pre> push af |
||
; |
; bcall |
||
pop af</pre> |
pop af</pre> |
||
a is nu weer teruggebracht in zijn oude staat, dus hoe hij was voordat de instructie werd uitgevoerd. |
a is nu weer teruggebracht in zijn oude staat, dus hoe hij was voordat de instructie werd uitgevoerd. |
||
Regel 25: | Regel 25: | ||
|} |
|} |
||
==Problemen bij het gebruik van de stack== |
==Problemen bij het gebruik van de stack== |
||
Er is iets waar je bij het gebruik van de stack heel goed op moet letten. Het besturingssysteem van de TI gebruikt de stack zelf namelijk ook. Je moet de stack dus precies hetzelfde achterlaten als hij was toen het programma startte. Zie het volgende voorbeeld. |
Er is iets waar je bij het gebruik van de stack heel goed op moet letten. Het besturingssysteem van de TI gebruikt de stack zelf namelijk ook, namelijk om op te slaan waar hij terug moet keren na afloop van het programma. Je moet de stack dus precies hetzelfde achterlaten als hij was toen het programma startte, want anders springt TI-OS ergens anders heen terug en dat is hoogstwaarschijnlijk geen nuttige programmacode. Zie het volgende voorbeeld. |
||
<pre> ; start van het programma |
<pre> ; start van het programma |
||
push af |
push af |
||
Regel 31: | Regel 31: | ||
pop af |
pop af |
||
ret ; terug naar de TI-OS</pre> |
ret ; terug naar de TI-OS</pre> |
||
Als het programma wordt beëindigd |
Als het programma wordt beëindigd, veroorzaak je direct een crash (dus het RAM wordt gewist), omdat de stack, en dus het 'bovenste' getal, niet meer hetzelfde is als vóór het programma. |
||
'''Zorg er dus voor dat de stack altijd gelijk is vóór en na je programma!''' |
'''Zorg er dus voor dat de stack altijd gelijk is vóór en na je programma!''' |
||
Verder kan het programma crashen als je heel veel registerparen op de stack legt (bij ongeveer 100). |
Verder kan het programma crashen als je heel veel registerparen op de stack legt (bij ongeveer 100). |
||
==Opdracht== |
|||
De bcall <code>_PutS</code> vernielt het registerpaar <code>hl</code>. Schrijf een programma dat iets naar het scherm schrijft met <code>_PutS</code> en <code>hl</code> bewaart. Tip: met <code>_DispHL</code> kun je <code>hl</code> wegschrijven naar het scherm om te kijken of je het goed gedaan hebt. {{Niet afdrukken|Als het niet lukt, kijk dan hieronder voor het antwoord. |
|||
{{Toggletext |
|||
|koptekst=Klap uit voor het antwoord |
|||
|hoofdtekst= |
|||
...bezig... |
|||
</pre> |
|||
...bezig... |
|||
}} |
|||
}} |
|||
{{Alleen afdrukken|''Het antwoord staat achterin het boek.''}} |
|||
{{VorigeVolgende |
{{VorigeVolgende |
Versie van 25 jan 2011 22:26
In plaats van variabelen, kun je om registers op te slaan en weer in te lezen ook de stack gebruiken. De stack is een soort rij met getallen. Stel het je voor als een toren met blokken. Je kunt alleen blokken erbij of eraf halen aan de bovenkant. Wat je dus het eerste erin legt komt er het laatste weer uit. Met de stack kun je ook maar twee dingen doen: een registerpaar er 'aan de bovenkant opleggen' en een registerpaar er 'aan de bovenkant afhalen'.
De stack gebruiken
Een registerpaar op de stack leggen
Je kunt alleen registerparen toevoegen aan de stack (dus af, bc, de, hl). Als je bijvoorbeeld af op de stack wilt leggen, gaat dit als volgt.
push af
Wil je bijvoorbeeld a opslaan op de stack, dan moet je f erbij nemen, omdat je alleen maar registerparen kunt opslaan in de stack.
Een registerpaar van de stack afhalen
Je kunt aan de 'bovenkant' van de stack een getal afhalen en deze weer opslaan in een registerpaar. Als je bijvoorbeeld het bovenste getal van de stack wilt halen en dit opslaan in af, gaat dat als volgt:
pop af
Een praktische toepassing
Je weet al dat je er bij bcalls vanuit moet gaan dat alle registers veranderd worden. Wil je a bijvoorbeeld bewaren, maar moet er een instructie uitgevoerd worden, kan dat eenvoudig met de stack:
push af ; bcall pop af
a is nu weer teruggebracht in zijn oude staat, dus hoe hij was voordat de instructie werd uitgevoerd.
Problemen bij het gebruik van de stack
Er is iets waar je bij het gebruik van de stack heel goed op moet letten. Het besturingssysteem van de TI gebruikt de stack zelf namelijk ook, namelijk om op te slaan waar hij terug moet keren na afloop van het programma. Je moet de stack dus precies hetzelfde achterlaten als hij was toen het programma startte, want anders springt TI-OS ergens anders heen terug en dat is hoogstwaarschijnlijk geen nuttige programmacode. Zie het volgende voorbeeld.
; start van het programma push af push hl pop af ret ; terug naar de TI-OS
Als het programma wordt beëindigd, veroorzaak je direct een crash (dus het RAM wordt gewist), omdat de stack, en dus het 'bovenste' getal, niet meer hetzelfde is als vóór het programma.
Zorg er dus voor dat de stack altijd gelijk is vóór en na je programma!
Verder kan het programma crashen als je heel veel registerparen op de stack legt (bij ongeveer 100).
Opdracht
De bcall _PutS
vernielt het registerpaar hl
. Schrijf een programma dat iets naar het scherm schrijft met _PutS
en hl
bewaart. Tip: met _DispHL
kun je hl
wegschrijven naar het scherm om te kijken of je het goed gedaan hebt.
Het antwoord staat achterin het boek.