Πίσω

Δραστηριότητα 4

Δίνεται το παρακάτω πρόγραμμα σε κώδικα assembly.

.data      0x10000000
a: .word      0x1, 0x2, 0x4, 10
n:  .word      0x4
sum: .space   4
.text
.globl main
main: la $t0, sum
sw $0, 0($t0)
la  $t1, n
lw $t1, 0($t1)
add $t2, $0, $0
la $t3, a
brox: bge    $t2, $t1, telos
add    $t4, $t2, $t2
add    $t4, $t4, $t4
add    $t4, $t3, $t4
lw     $t4, 0x0($t4)
lw     $t5, 0x0($t0)
add    $t5, $t5, $t4
sw     $t5, 0x0($t0)
addi $t2, $t2, 1
beq  $0, $0, brox
telos: li    $v0, 10
syscall

α) Να εξηγήσετε την εκτέλεση των εντολών του προγράμματος.
β) Να περιγράψετε τη λειτουργία του προγράμματος.
γ) Να εκτελέσετε το παραπάνω πρόγραμμα στον προσομοιωτή Spim και να σχολιάσετε τα αποτελέσματα. Ο προσομοιωτής Spim βρίσκεται στη σελίδα:

http://hermes.di.uoa.gr/PCSpim.zip


Απάντηση δραστηριότητας 4

.data      0x10000000 (ορίζει τη διεύθυνση από την οποία θα αρχίσουν να αποθηκεύονται τα δεδομένα)
a: .word      0x1, 0x2, 0x4, 10
(αποθηκεύει στις διευθύνσεις 0x10000000, 0x10000004, 0x10000008, 0x1000000C τις τιμές των αριθμών (0x1,0x2,0x4,10) αντίστοιχα και ονομάζει τη διεύθυνση 0x10000000 a)
n:  .word      0x4 (αποθηκεύει στη διεύθυνση 0x100000010 την τιμή 0x4 και ονομάζει αυτή την διεύθυνση n)
sum: .space   4 (παραχωρεί χώρο 4 bytes στη διεύθυνση 0x100000014 και ονομάζει αυτή την διεύθυνση sum)
.text (ορίζεται η αρχή των εντολών)
.globl main
(χρησιμοποιείται πάντα στην αρχή των προγραμμάτων του προσομοιωτή Spim και δηλώνει πως το συγκεκριμένο πρόγραμμα μπορεί να χρησιμοποιηθεί από διαφορετικά αρχεία του προσομοιωτή)
main: (ξεκινάει το κυρίως πρόγραμμα)
la $t0, sum (φορτώνεται στον καταχωρητή $t0 η διεύθυνση sum)
sw $0, 0($t0) (αποθήκευση της τιμής 0 στη διεύθυνση μνήμης που περιέχεται στον καταχωρητή $t0)
la  $t1, n (φορτώνεται στον καταχωρητή $t1 η διεύθυνση n)
lw $t1, 0($t1)
(φορτώνονται στον καταχωρητή $t1, τα δεδομένα που βρίσκονται στη διεύθυνση μνήμης που περιέχεται στον καταχωρητή $t1)
add $t2, $0, $0 (ο καταχωρητής $t2 παίρνει την τιμή 0)
la $t3, a (φορτώνεται στον καταχωρητή $t3 η διεύθυνση a)
brox: (αρχίζει ο βρόγχος)
bge    $t2, $t1, telos
(ελέγχεται αν το περιεχόμενο του καταχωρητή $t2 είναι μεγαλύτερο ή ίσο με το περιεχόμενο του $t2 και αν ισχύει βγαίνει από το βρόγχο)
add    $t4, $t2, $t2
(γίνεται η πρόσθεση των περιεχομένων των καταχωρητών $t2 και $t2 και τo αποτέλεσμα αποθηκεύεται στον καταχωρητή $t4)
add    $t4, $t4, $t4
(γίνεται η πρόσθεση των περιεχομένων των καταχωρητών $t4 και $t4 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή $t4)
add    $t4, $t3, $t4
(γίνεται η πρόσθεση των περιεχομένων των καταχωρητών $t3 και $t4 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή $t4)
lw     $t4, 0x0($t4)
(φορτώνονται στον καταχωρητή $t4 τα δεδομένα που βρίσκονται στη διεύθυνση μνήμης που περιέχεται στον καταχωρητή $t4)
lw     $t5, 0x0($t0)
(φορτώνονται στον καταχωρητή $t5 τα δεδομένα που βρίσκονται στη διεύθυνση μνήμης που περιέχεται στον καταχωρητή $t0)
add    $t5, $t5, $t4
(γίνεται η πρόσθεση των περιεχομένων των καταχωρητών $t4 και $t5 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή $t5)
sw     $t5, 0x0($t0) (αποθήκευση του περιεχομένου του καταχωρητή $t5 στη διεύθυνση μνήμης που περιέχεται στον καταχωρητή $t0)
addi    $t2, $t2, 1
(γίνεται η πρόσθεση του περιεχομένου του καταχωρητή $t2 με το 1 και το αποτέλεσμα αποθηκεύεται στον καταχωρητή $t2)
beq      $0, $0, brox (μεταφέρει τη ροή του προγράμματος στο brox)
telos: li    $v0, 10 (οι δύο αυτές εντολές τερματίζουν το πρόγραμμα στον προσομοιωτή SPim)
syscall