Programmeren in TI-83+ Assembly/Geheugenbeheer/Arrays en matrices
Een array is een reeks van dezelfde soort variabelen. Bijvoorbeeld, als je 10 bedragen op wilt slaan, kun je een array maken met 10 getallen. In Assembly bestaat de structuur van een array helaas niet, dus die moet "met de hand" worden opgezet.
Een simpele array maken
[bewerken]Om een serie bedragen op te slaan, kun je natuurlijk het volgende codefragment gebruiken.
bedrag01 .equ appBackUpScreen bedrag02 .equ appBackUpScreen + 1 bedrag03 .equ appBackUpScreen + 2 bedrag04 .equ appBackUpScreen + 3 bedrag05 .equ appBackUpScreen + 4 bedrag06 .equ appBackUpScreen + 5 bedrag07 .equ appBackUpScreen + 6
enzovoorts.
Ten eerste is dit niet erg handig en het ziet er niet mooi uit. Bovendien maak je gemakkelijk typfouten. Ten tweede: stel je voor dat je in het register a een getal van 1 tot 10 hebt opgeslagen en je wilt dan bedrag nummer a hebben. Dat is op deze manier ook niet mogelijk.
Om een oplossing voor deze problemen te vinden, kijken we naar de regels hierboven. Je ziet dat het eerste bedrag wordt opgeslagen in appBackUpScreen. De algemene formule voor bedrag nummer a is dus appBackUpScreen + a als je a laat beginnen bij 0 voor het eerste element.
Hoe maken we hier nu een array van? Je begint met de positie van het eerste bedrag.
bedragenArray .equ appBackUpScreen
Als we nu het a-de bedrag willen aanspreken, dan moet je dus de hierboven genoemde formule inprogrammeren:
ld h, 0 ld l, a ; a opslaan in hl add hl, bedragenArray ; hl optellen bij de startwaarde, nu staat het geheugenadres van het a-de bedrag dus in hl
Nu kun je dit geheugenadres gebruiken om iets in op te slaan, bijvoorbeeld:
ld (hl), 15 ; het a-de bedrag wordt 15
Een stapgrootte die groter is dan 1
[bewerken]Wil je een serie teksten opslaan, dan heb je meer dan 1 byte per element nodig. Het aantal bytes per element heet de stapgrootte. Een voorbeeld:
tekst01 .equ appBackUpScreen tekst02 .equ appBackUpScreen + 8 tekst03 .equ appBackUpScreen + 16 tekst04 .equ appBackUpScreen + 24 tekst05 .equ appBackUpScreen + 32 tekst06 .equ appBackUpScreen + 40 tekst07 .equ appBackUpScreen + 48
enzovoorts.
Keuze van de stapgrootte Zorg ervoor dat de stapgrootte minstens zo groot is als het grootste element; anders loop je het risico dat de elementen elkaar overschrijven! |
De stapgrootte is bij het bovenstaande voorbeeld 8. De algemene formule voor bedrag nummer a is dus appBackUpScreen + 8*a als je a laat beginnen bij 0.
Om hier een element aan te spreken, moeten we eerst a vermenigvuldigen met 8 en het daarna bij de startwaarde optellen.
tekstenArray .equ appBackUpScreen add hl, a ; dit vermenigvuldigt a met 2 add hl, a ; dit vermenigvuldigt a nog een keer met 2, dus in totaal keer 4 add hl, a ; dit vermenigvuldigt a nog een keer met 2, dus in totaal keer 8 ld h, 0 ld l, a ; a opslaan in hl, hl is nu dus 8 keer de oorspronkelijke a add hl, tekstenArray ; optellen bij startwaarde, nu staat het geheugenadres van het a-de bedrag dus in hl
Nu kun je dit geheugenadres weer gebruiken om data te lezen en op te slaan.
Matrices
[bewerken]Als voorbeeld van een matrix gaan we hier een cijferlijst maken.
Je kunt een array maken met cijfers voor een vak, bijvoorbeeld met de cijfers 5, 7, 6 en 8. Dit is gewoon een normale array. Willen we nu echter meer dan één vak in de cijferlijst zetten, dan hebben we meerdere arrays nodig, voor ieder vak dus één. Die kun je één voor één maken, maar het is het ook mogelijk om de arrays van de vakken in een nieuwe array te zetten. Een dergelijke structuur heet een matrix. Kijk bijvoorbeeld naar de volgende cijferlijst als voorbeeld.
Cijfer 1 | Cijfer 2 | Cijfer 3 | Cijfer 4 | |
---|---|---|---|---|
Vak 1 | 5 | 7 | 6 | 8 |
Vak 2 | 9 | 7 | 9 | 6 |
Vak 3 | 7 | 7 | 3 | 6 |
Vak 4 | 10 | 8 | 9 | 9 |
Vak 5 | 5 | 7 | 4 | 5 |
Vak 6 | 8 | 6 | 7 | 7 |
Vak 7 | 9 | 7 | 9 | 10 |
We moeten dus als eerste een array van vakken maken. Hierna bevat ieder element van de vakken-array nog een array, namelijk een array van 4 cijfers.