Files
RTS10_labs/assignment_assembly/readme.md
2024-09-15 16:37:35 +02:00

89 lines
4.9 KiB
Markdown

# Assembly Assignment
## opdrachten
Ik moest de volgende assignment maken:
- Assignment 1: Testing a simple LEGv7 Pinky program
- Assignment 2: Writeting a simple multiplication program
- Assignment 5: A smarter tail recursive multiply algorithm
- Assignment 7: A smarter power algorithm
## Testing a simple LEGv7 Pinky program
Er is een project gegeven die tegevoerd en getest moet worden. De eerste keer dat ik door de stappen heen ging kreeg een een error dat de openOCD.exe fout ging. Dit is logiesh voor mij, omdat ik linux gebruikt als OS en .exe alleen voor Windows zijn.
![openOCD error](assignment1/first_error.png)
Het opnieuw selecteeren van de OpenOCD debug probe in het 'Debug Configurations' venster werdt de linux variant corect ingesteld en werkte het.
Voor de zekerheid heb ik het nog een keer geprobeerd terwel ik alle weizigingen in het project bij hou ik git^[voor de geintreseerde heb ik de git repo op mijn server gezet waar de commit van de clock wiezigingen te vinden is met de volgende link (https://gitea.finnvanreenen.nl/FReenen/RTS10_assignment_project_files/commit/4dcb59bc058b3a710a1ca471e4a5d007f64f344c)[https://gitea.finnvanreenen.nl/FReenen/RTS10_assignment_project_files/commit/4dcb59bc058b3a710a1ca471e4a5d007f64f344c]]. Hier zag ik dat er wat clock instellingen werden geweiziged. Dus ik heb het opniew geprobeerd maar dat aleen het veld 'OpenOCD Command' aangepast in de debug configuratie. Met deze methode werden de klock instellingen niet aangepast, alleen een aantal dingen dat ik herken als de verschillen tussen Windows en Linux.
Hierna werken het nogsteed zoals verwacht.
![assegnment 1 output](assignment1/output.png)
## Writeting a simple multiplication program
Om te beginnen heb ik het project van de vorige assignment. Hier heb ik aan *main.c* een paar simpele regels toegevoegd om de basis werking te testen.
![simpele test code](assignment2/main.c)
Pas toen ik het werkend had kwam ik achter dat ik `a` en `b` heb omgedraaid. Dit maakt gelukkig niet uit in een vermedigvuldiging. Daarnaast heb ik ook `i` weg gewerkt door i.p.v. `i` te verhogen en daarna te vergeleiken met `b` heb ik `b` verlaagd tot het 0 is.
Dit is mijn implementatie:
![asambly implementatie van vermedigvuldiging](assignment2/multiply.asm)
En het test resultaat:
![screenshot test resultaat](assignment2/rest_result.png)
### How many instructions does it take your procedure to run the code: `multiply(65535, 65535)`?
65535 (decimaal) = 0xFFFF (hex) ofwel 16 eenen in binair.
Voor de loop zijn 3 instructies.
een interatie van de loop zijn 4 instructies, deze loop wordt netzovaak ald de waarde van `b` uitgevoerd dus 4 * 65535 - 1 = 262139 instructies (de - 1 is voor de laaste iteratie waar die uit de loop springt waardoor de laaste instructie in de loop wordt overgeslagen).
Na de loop zijn nog 2 instructie, dat een totaal maakt van 262144 instructies
## A smarter tail recursive multiply algorithm
Voor deze opdracht heb ik niet exect de gegeven C code na gemaakt. Ik heb de twee functies als een geschreven. Hierbij is het argument `m` van `function multiply2` verplaast als laaste argument i.p.v. de eerste en de `if (b == 0)` heb ik verplaats naar `multiply`.
Het verplatsen van argument `m` is alleen een probleem waneer er andere code is die gebruik maakt dat deze functie behalve `multiply`.
Het verplasen van de `if (b == 0)`statement is een optimazatie. Deze statement kan nooit waar zijn na de eerste iteratie. `b` wordt steeds 1 plek naar recht geschoven tot dat de laaste bit die `1` is op de 1 positie staat. In dat geval eindigd de funcie direct.
De asambly code:
![slimmere vermedigvuldiging assambly](assignment5/multiply.asm)
Het test resultaat:
![schreenshot testresultaat](assignment5/result.png)
### How many instructions does it take your procedure to run the code: `multiply(65535, 65535)`?
65535 (decimaal) = 0xFFFF (hex) ofwel 16 eenen in binair.
vanaf lable `multiply` duurt het 3 instructie tot de eerste branch instructie. Deze word niet genomen omdat `b` niet 0 is.
hierna komt `multiply2` waar de 2de instrucie een branche is die genomen wordt. b nog geen 0.
`check_even` heeft 3 instructies tot een brance. deze brance wordt altijd genomen omdat `b` in binar alleen maar uit 1en bestaat, dus het schuiven naar rechts (de enige bewerking die gedaan wordt op `b`) verandert bit 1 niet naar 0 voor dat `b` 1 is geweest waneer de loop eindigt.
`odd` heeft 4 instructies, waarna `multiply2` weer word geroepen.
De loop van `multiply2` -> `check_even` -> `odd` word 15 keer gedaan. Voor elk bitje dat 1 is in `b` tot dat er nog maar 1 over is. Deze loop betaat uit 8 instructies dus totaal 120 instructies.
waneer `b` == 1 is net nog 6 instructies tot de `BX.N LR` instrcutie.
Totaal is dat dus 129 instructies (3 van `multiply` + 120 van de loop + 6 van het einde). Dit is signifikant minder dat bij assignment 1, dit waren er 262144 dus deze implementatie is ongeveer 2032 keer minder instructies in dit specifieke geval.
## A smarter power algorithm