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

4.9 KiB

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

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 (4dcb59bc05]]. 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

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

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

En het test resultaat:

screenshot test resultaat

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

Het test resultaat:

schreenshot testresultaat

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