Car Week 5 440905

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

1/10

WEEK 5
Davy van Weijen| 440905 | 1G

OPDRACHT 1 : STACK STORAGE


In dit programma gaan we een array kopiëren naar een andere array, waarbij we
waarden die gelijk zijn aan een gegeven waarde, zeg x, overslaan.

Voorbeeld: Neem x=7 en array1 = 13 5 -2 4 7 8 0 7 7 9 7 . Als we bij het kopiëren het


getal 7 overslaan dan krijgen we als resultaat array2 = 13 5 -2 4 8 0 9

We slaan de waarden uit array1 van achter naar voren op in de stack (push) , waarbij
we de waarden die gelijk zijn aan x overslaan. Vervolgens lezen we de waarden 1
voor 1 van de stack (pop) en vullen daarmee de resultaat array array2. In
“stack_student.s” is de structuur van het programma gegeven.

a) Maak het programma af

-
b) Vergelijk de geheugenadressen van de waarden die op de stack worden
gepushed. Wordt een volgende waarde weggeschreven op een hoger of lager
geheugenadres?

De stack gaat van hoge adressen naar lagere geheugenadressen.

c) Wat gebeurt er als je buiten het gealloceerde data segment voor arr1 en arr2
schrijft? Je kunt dit proberen door in het gegeven programma
addi x28, zero, 0xff
sw x28, 100(x7)
sw x28, -100(x7)
toe te voegen.

Dan wordt de data weggeschreven.

1
2/10

d) Wat gebeurt als je buiten de stack schrijft? Je kunt dit proberen door in het
gegeven programma
addi x28, zero, 0xf
sw x28, 100(sp)
sw x28, -100(sp)
toe te voegen.

Ook hier wordt de data


weggeschreven.

e) Voer het volgende commando uit aan het eind van het programma en verklaar
het resultaat.
addi x28, zero, 0xf
sw x28, 6(sp)

Dan verschijnt er een foutmelding die zegt “Runtime exception: store address not
aligned on word boundary.”
Dit komt doordat sw een word wil wegschrijven van 4 bytes. Dit is alleen
mogelijk met een offset die een veelvou van vier is.

OPDRACHT 2 : NON-LEAF PROCEDURE


In deze opdracht gaan we de som van de kwadraten van de elementen in een array a
met n elementen berekenen:
som = a[0]*a[0} + a[1]*a[1] + ... + a[n-1]*a[n-1]

We gebruiken hiervoor twee procedures. Allereerst een procedure square, zie code in
“square.s”, die voor een gegeven geheel getal het kwadraat van dat getal berekent en
retourneert. Daarnaast de procedure euclid die het kwadraat van de elementen in een
array berekent en daarvoor de procedure square meerdere maken aanroept. Een deel
van de code is gegeven in “euclid.s”.
In “euclid.run.s” is code gegeven waarin een tweetal arrays worden gedefinieerd en
waarvan vervolgens de som van de kwadraten wordt berekend door de procedure
euclid aan te roepen.

a) Welke registers kunnen gebruikt worden om een procedure van input waarden te
voorzien?
Registers: a0, a1, a2, a3, a4, a5, a6 en a7
Dit zijn dus ook: x10, x11, X12, x13, x14, x15, x16 en x17

2
3/10

b) Welke registers kunnen gebruikt worden om het resultaat van een procedure in
op te slaan?
Registers: a0 en a1
Dit zijn dus ook: x10 en x11

c) Welke registers mogen door een procedure niet van waarde veranderen, d.w.z.
na afloop van de procedure moet de waarde gelijk zijn aan de beginwaarde?
s0 tot en met s11, dit zijn dus x8, x9 en x18 tot en met x27.
Stack-pointer: sp = x2
Return-adres = x1

d) Als een van deze register genoemd bij c) tijdens de uitvoering van een
procedure wordt gewijzigd, bijvoorbeeld omdat er een andere procedure wordt
aangeroepen, dan moet de procedure deze waarden aan begin van de
procedure opslaan op de stack en aan het eind van de procedure de waarden uit
de stack terugplaatsen in de betreffende registers en de ruimte op de stack
vrijgeven.
Voeg de code toe in “euclid.s” om de benodigde info op de stack op te slaan en
weer uit te lezen, zie regels beginnend met “# add code to ”

3
4/10

4
5/10

OPDRACHT 3 : FIBONNACCI ARRAY - CODE

De Fibonacci reeks bestaat uit de volgende getallen: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...

Elk getal in de reeks is de som van de 2 voorgaande getallen, bijvoorbeeld: 13=5+8,


21=8+13.

Algemeen geldt: fib[n+1] = fib[n] + fib[n-1] voor n>=1

fib[0]=0 en fib[1] =1

Schrijf een programma dat de eerste 100 fibonacci getallen berekend en opslaat in het
data segment, zodat we de berekende waardes in een ander deel van het programma
kunnen gebruiken. Maak gebruik van een loop waarbij in elke loop het volgende
fibonacci getal wordt berekend. Uitkomsten kun je controleren met
http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html#100.

Om zoveel mogelijk getallen correct, d.w.z zonder overflow, te kunnen berekenen


schrijven we elk fibonacci getal in het geheugen als een double word. Om dat te
kunnen doen moeten we eerst in “Settings” de optie “64-bits” aan te vinken. Om de
waardes in registers en in het data segment als decimale getallen weer te geven moet
je in “Settings” de optie “Values displayed in hexadecimal” uitvinken.

a) Eerst controleren we hoeveel ruimte er in het data segment is. Via Settings = >
Memory Configuration kun je de default configuratie van het geheugen bekijken.
Het data segment begint bij het “data segment base address” en loopt tot het
“heap base address”.
Hoeveel getallen van 64 bits kunnen we dus opslaan in het data segment?

3 x 213 = 24576

Pas het programma uit “fibonacci_student.s” aan zodat het de fibonacci getallen opslaat
in het data segment.

b) We declareren eerst een variabele array fib en reserveren voldoende geheugen


voor het opslaan van 100 fibonacci getallen (64-bits).
- Vul op de puntjes het juiste getal in (hoeveel bytes per fib getal?).

5
6/10

.eqv maxMem 800


64 bits, 8 bytes per getal.

c) Voeg de code voor het init blok toe.


- sla het base adres van fib op in een register, bijv x29.
- sla de waarde van fib[0] op in het register x10 en in het data segment.
- sla de waarden van fib[1] op in het register x11 en in het data segment.
- zet de waarde van counter n op 1 in x12
- zet de maximum waarde van de counter n in x13

6
7/10

d) Voeg de code voor het fibloop blok toe.


Neem hierbij aan dat
- sla oud fib[n] getal tijdelijk op in x14
- bereken nieuw fibonacci getal fib[n+1] en sla dit op in x11
- sla vorige getal fib[n] op in x10
- verhoog de waarde in het register dat verwijst naar de array met fibonacci getallen met
de benodigde offset
- sla nieuw berekend getal op in data segment (als er geen overflow is opgetreden)
- verhoog de counter n met 1
- controleer of counter n de maximum waarde heeft bereikt en zorg dat het programma
in het juiste blok (fibloop of end) wordt voortgezet

e) Voeg de code voor het overflow blok toe.


- sla het laatst berekende getal zonder overflow op in het data segment

7
8/10

OPDRACHT 4 : FIBONNACCI ARRAY - ANALYSE

Run het programma zodat de fibonacci getallen worden berekend en weggeschreven in het
data segment.

a) Waarom hoeft er aan het eind van het init blok geen jump naar het fibloop blok te
worden opgenomen?
- Het blok: fiboop bevat de eerstvolgende instructie en wordt dus uitgevoerd na
de afloop van init
b) Zoek de waarde 0x2ff42 van fib[27] op in het data segment. Wat is het
geheugenadres van deze waarde en welke adressen worden gebruikt om deze
waarde op te slaan?
- 0x100100d8, klopt.
c) Zoek de waarde 196418 van fib[27] op in het data segment. Wat is het
geheugenadres van deze waarde?
0x2ff42 = 196418, dit staat op geheugenadres 268501208 = 0x100100d8
d) Een oplettende student ziet in de simulator in het data segment op adres
268501368, oftewel 268501344(+24), voor het eerst een negatief getal staan, zie
ook onderstaand screenshot (let op: geheugenadressen en waardes zijn decimaal
weergegeven).

Leg uit waarom dit niet wijst op overflow.


- Geen overflow omdat hier alleen gesignde bits gebruikt worden, waarbij een 1
een negatief getal betekent, maar het is geen negatief getal dus wordt de 1
tegengesteld door er een ‘-’ voor te zetten.
e) Bestudeer de fibonacci getallen die zijn weggeschreven in het data segment en leg
uit hoe je kunt zien dat er overflow is opgetreden.
- De getallen gaan uiteindelijk over de 64 bits heen.
f) Voeg code toe zodat het programma stopt als er overflow optreedt. Op deze manier
worden alleen goed berekende fibonacci getallen opgeslagen in het data segment.

- bltu x11, zero, end

8
9/10

OPDRACHT 5 : ADD ABSOLUTE VALUES – NON-LEAF PROCEDURE

Schrijf een programma met daarin de volgende procedures:


• abs_value: procedure die 1 integer als input heeft en als resultaat de absolute
waarde van de input berekent: bijv voor input -3 is resultaat +3, voor input +2 is
resultaat +2.
o Voor input en output moet het a0 register worden gebruikt. o
“abs_value.s”
• add_abs: procedure die 2 integers als input heeft en als resultaat de absolute
waarde van de beide inputs bij elkaar optelt: bijv. voor de inputs -3 en 4 is het
gewenste resultaat 3+4=7. o Voor input van de beide registers moeten het a0 en
a1 register worden gebruikt.
o Voor de output moet het a0 register worden gebruikt. o Voor het
berekenen van de absolute waarde van de beide inputs moet de
procedure abs_value worden aangeroepen!
o Plaats de code voor deze procedure in “add_abs.s”

Met behulp van het programma “add_abs_test.s” kan de werking van de beide procedures
worden getest.

9
10/10

10

You might also like