Programmeren in TI-83+ Assembly/Geheugenbeheer/Arrays en matrices

Uit Wikibooks

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

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.

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

InformatieDe grootte van a
Als je het a-de element van een array aanroept, dan moet je op een paar dingen letten. Zorg er ten eerste voor dat a nooit zo groot is dat je het beschikbare geheugen overschrijdt, dit kan je programma laten crashen. Ten tweede is het belangrijk om in te zien dat het met de hierboven staande methode niet mogelijk is om een array van meer dan 255 bytes te maken, aangezien a niet meer dan 255 kan worden. Een oplossing hiervoor is om a eerst om te zetten naar hl en dan hl te vermenigvuldigen. Probeer dit zelf eens.


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.

← Het gebruik van EQU Arrays en matrices Het gebruik van ldir →
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.