Programmeren in TI-83+ Assembly/Printversie: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
Willem1 (overleg | bijdragen)
Geen bewerkingssamenvatting
Willem1 (overleg | bijdragen)
+ Variabelen en De stack
Regel 249:
Maak een programma dat het getal 14 in het register a laadt, en dit daarna overzet naar register b.<br/>
''Het antwoord vind je aan het einde van dit boek.''
 
 
<div style='text-align: center;background-color: #efefef;border: none' height=150>
<br/>
<font size=5pt>Variabelen</font>
<br/><br/>
</div>
 
Registers zijn perfect om gegevens op te slaan die je direct weer nodig hebt. Maar gegevens die je voor langere tijd nodig hebt, moet je dus vooral niet in een register zetten (zie einde vorige paragraaf). Daarom is er nog een andere mogelijkheid om gegevens op te slaan, namelijk variabelen. Om deze te gebruiken moeten we echter eerst twee andere dingen leren, die er ogenschijnlijk niets mee te maken hebben.
 
==ld bij geheugenadressen==
Soms wil je iets opslaan in het geheugen, bijvoorbeeld de inhoud van hl opslaan in geheugenplaats $8000. Je zou het misschien zo doen:
<pre>
ld $8000, hl
</pre>
Alleen, dat gaat niet goed. De rekenmachine gaat nu namelijk proberen om de waarde van hl in het '''nummer''' 8000 op te slaan.
 
Hieronder zie je hoe het wel werkt:
<pre>
ld ($8000), hl
</pre>
De haakjes rond het adres betekenen dat het geheugenadres wordt bedoeld.
 
Wil je nu het getal 0 in het adres $8000 laden, kan dat als volgt.
<pre>
ld hl, $8000
ld (hl), 0
</pre>
 
==Labels==
Labels bestaan uit regels zonder tab met een naam en daarachter een dubbele punt. Bijvoorbeeld:
<pre>
Tekst:
</pre>
Later in deze cursus leren we naar deze labels toe te springen, maar ze zijn nu alvast nodig voor variabelen.
 
==Variabelen gebruiken==
Nu we deze twee kleine puntjes behandeld hebben, gaan we door naar iets wat moeilijker is, namelijk het gebruiken van variabelen. Eerst een voorbeeld, daarna de uitleg.
<pre>
Tekst:
.db "Hallo!",0
</pre>
 
Wat doet dit nu? Eerst staat er een label, dat Tekst heet. Op de volgende regel staat de instructie .db. Dit zorgt ervoor dat er aan het programma een stukje wordt toegevoegd, in dit geval dus de string "Hallo!", en daarachter een 0. Wil je de variabele nu aanspreken, dan gebruik je (Tekst). Het label Tekst is namelijk eigenlijk een geheugenadres (zoals $8000). We willen de gegevens hebben uit dit geheugenadres, dus gebruik je haakjes.
 
==Tekst op het scherm schrijven==
Omdat je waarschijnlijk nog steeds niet helemaal snapt wat je nu met variabelen moet en hoe ze werken, volgt hier een voorbeeldprogramma dat tekst op het scherm schrijft.
<pre>
; Vul de standaardcode zelf aan (zie hoofdstuk 2).
 
bcall(_ClrLCDFull) ; Eerst maken we het scherm leeg.
ld hl, 0 ; Laad 0 in hl.
ld (PenCol), hl ; Laad nu hl=0 in de kolom van schrijven.
ld hl, Tekst ; Laad het label in hl.
bcall(_PutS) ; Zet de tekst, die staat vanaf hl (dus het label) op het scherm.
bcall(_NewLine) ; Zet de cursor op de volgende regel op kolom 0.
ret ; Terug naar de TI-OS.
 
Tekst: ; Label Tekst
.db "Hallo!", 0 ; Voeg aan het programma de tekenreeks "Hallo!" toe, gevolgd door een nul.
</pre>
 
Ik zal nu stukje voor stukje uitleggen wat er gebeurt.
<pre>
bcall(_ClrLCDFull) ; Eerst maken we het scherm leeg.
</pre>
Voordat we op het scherm gaan schrijven, wordt het leeggemaakt om te voorkomen dat we over iets anders heen schrijven.
<pre>
ld hl, 0 ; Laad 0 in hl.
ld (PenCol), hl ; Laad nu hl=0 in de kolom van schrijven.
</pre>
Dit is de code om de '''(PenCol)''' (dat is de kolom waarin we gaan schrijven) 0 te maken. Dit moet echter via het register hl, dus we laden eerst 0 in hl, en daarna de inhoud van hl in (PenCol).
<pre>
ld hl, Tekst ; Laad het label in hl.
</pre>
Nu wordt het geheugenadres van het label Tekst geladen in het register hl. Dit zou bijvoorbeeld $8000 kunnen zijn.
<pre>
bcall(_PutS) ; Zet de tekst, die staat vanaf hl (dus het label) op het scherm.
</pre>
Dit is een nieuwe bcall. Hij zet de tekst, die begint bij hl, op het scherm. Hierbij houdt hij rekening met (PenCol). Het resultaat is dus dat "Hallo!" op het scherm wordt gezet.
<pre>
bcall(_NewLine) ; Zet de cursor op de volgende regel op kolom 0.
</pre>
De cursor wordt nu naar de volgende regel verplaatst, zodat de tekst op de volgende regel komt, als we nog iets zouden willen schrijven.
<pre>
ret ; Terug naar de TI-OS.
</pre>
Dit moet nu duidelijk zijn. Zie anders hoofdstuk 2.
<pre>
Tekst: ; Label Tekst
.db "Hallo!", 0 ; Voeg aan het programma de tekenreeks "Hallo!" toe, gevolgd door een nul.
</pre>
Het label Tekst is dus eigenlijk een geheugenadres. Hierop wordt dan met de opdracht .db "Hallo!" gezet. Daarachter volgt een 0, omdat de _PutS stopt als hij een 0 tegenkomt.
 
==Opdracht 2==
Maak een programma met een variabele Getal, die aan het begin van het programma 0 bedraagt. Aan het eind van het programma moet de variabele 2 bedragen. Als het niet lukt, kijk dan op het einde van het boek voor het antwoord.
 
<div style='text-align: center;background-color: #efefef;border: none' height=150>
<br/>
<font size=5pt>De stack</font>
<br/><br/>
</div>
 
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.
<pre> push af</pre>
Wil je bijvoorbeeld a opslaan op de stack, dan moet je f erbij nemen, omdat je alleen maar registerparen kunt opslaan in de stack.
{| border="0" cellspacing="0" align="right" cellpadding="2"
|[[Afbeelding:Stack_pushen.png|thumb|none|Iedere keer als iets op de stack gelegd wordt, dan komt dit "bovenop de toren" te liggen. Je kunt dan niet meer direct bij onderliggende getallen.]]
|[[Afbeelding:Registers_naar_stack.png|thumb|none|Merk op dat je een getal dat op de stack ligt, er weer met een ander registerpaar vanaf kunt halen. Dat gebeurt hier bijvoorbeeld met af/de.]]
|}
 
===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:
<pre> pop af</pre>
 
===Een praktische toepassing===
Je weet al dat je er bij instructies 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
; instructie
pop af</pre>
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. Je moet de stack dus precies hetzelfde achterlaten als hij was toen het programma startte. Zie het volgende voorbeeld.
<pre> ; start van het programma
push af
push hl
pop af
ret ; terug naar de TI-OS</pre>
Als het programma wordt beëindigd, en de TI-OS probeert iets van de stack te halen, veroorzaak je 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).
 
 
<div style='text-align: center;background-color: silver;border: none' height=150>
Regel 263 ⟶ 402:
ret ; terug naar TI-OS
</pre>
 
==Opdracht 2==
 
Een mogelijk antwoord zie je hier. Vul de standaardcode zelf aan.
<pre>
ld a, 2 ; 2 in a laden
ld (Getal), a ; het getal in a in Getal laden (haakjes!)
ret ; terug naar TI-OS
 
Getal:
.db 0
</pre>
Merk op dat je 2 niet direct in (Getal) kunt laden, dit moet via een register (in dit geval a).
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.