ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www.cslab.ece.ntua.gr 1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Ακ. έτος 2014-2015, 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς. Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα» του ΕΜΠ έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟ ΛΟ ΓΙ ΣΤΙ ΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www. c sl a b. ec e. n t ua. gr 1η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ Ακ. έτος 2014-2015, 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ Τελική Ημερομηνία Παράδοσης: 14/12/2014 ΜΕΡΟΣ Α Δίνεται το παρακάτω πρόγραμμα γραμμένο σε C, καθώς και η αντίστοιχη μετάφραση του σε assembly MIPS. Συμπληρώστε τα κενά. Σας υπενθυμίζουμε ότι ο καταχωρητής $zero είναι πάντα μηδέν. Δίνεται επίσης ότι η διεύθυνση των πρώτων στοιχείων των πινάκων a και b βρίσκονται αποθηκευμένα στους καταχωρητές $t4 και $t5 αντίστοιχα. (Θέμα Σεπτέμβριος 2014) int a[20], b[20] i; int mask = 0xFFFAB000; for (i=0; i < 10; i+=2){ a[i] = (a[i+3] & mask) b[i+1]; } add lui $t1, $zero, $t2, $t2, $t2, loop: lw, ($t4) and, $t3, $t2 lw $t6, 4( ), $t3, $t6 sw $t3, ( ) addi $t4, $t4, addi $t5, $t5, addi $t1, $t1, addi, $t1, bne $t8,, loop ΜΕΡΟΣ B Υλοποίηστε τη διαδικασία (procedure) encode_message σε assembly MIPS η οποία κωδικοποιεί ένα μήνυμα κειμένου με τη χρήση ενός κλειδιού κωδικοποίησης. Θεωρήστε πως το μήνυμα κειμένου είναι μία συμβολοσειρά (null-terminated ASCII string) και το κλειδί κωδικοποίησης μία ακολουθία bytes με μήκος >= 1 (δεν απαιτείται έλεγχος). Η κωδικοποίηση γίνεται με τον εξής τρόπο: Κάθε χαρακτήρας του κειμένου γίνεται XOR με ένα byte του κλειδιού. Όταν φτάσουμε στο τελευταίο byte του κλειδιού ξεκινάμε πάλι από το byte 0. Ο χαρακτήρας NULL (ASCII 0x00) του κειμένου δεν κωδικοποιείται. Η διαδικασία δέχεται τα εξής ορίσματα: στον $a0 έναν δείκτη στη θέση του πρώτου στοιχείου του κειμένου. στον $a1 έναν δείκτη στη θέση του πρώτου στοιχείου του κλειδιού κωδικοποίησης. στον $a2 έναν θετικό ακέραιο που συμβολίζει το μήκος του κλειδιού κωδικοποίησης.
Η κωδικοποίηση του μηνύματος γίνεται in-place, δηλαδή το κωδικοποιημένο μήνυμα γράφεται στις θέσεις μνήμης που καταλάμβανε το αρχικό μήνυμα. Παράδειγμα: Στη διεύθυνση 0x1000 είναι αποθηκευμένο σε ASCII κωδικοποίηση το μήνυμα Hello, World, και στην διεύθυνση 0x1010 το κλειδί της κωδικοποίησης (η ASCII κωδικοποίηση του cslab ): Διεύθυνση Bytes 0x1000 0x48 0x65 0x6C 0x6C 0x6F 0x2C 0x20 0x57 0x1008 0x6F 0x72 0x6C 0x64 0x00 0x00 0x00 0x00 0x1010 0x63 0x73 0x6C 0x61 0x62 0x00 0x00 0x00 Μετά την κλήση της διαδικασίας encode_message η μνήμη περιέχει τα παρακάτω δεδομένα: Διεύθυνση Bytes 0x1000 0x2B 0x16 0x00 0x0D 0x0D 0x4F 0x53 0x3B 0x1008 0x0E 0x10 0x0F 0x17 0x00 0x00 0x00 0x00 0x1010 0x63 0x73 0x6C 0x61 0x62 0x00 0x00 0x00 ΜΕΡΟΣ Γ Δίνεται η παρακάτω ρουτίνα σε C για την εύρεση ενός κόμβου με συγκεκριμένο κλειδί σε ένα δυαδικό δέντρο αναζήτησης (binary search tree BST). Υλοποιήστε την αντίστοιχη ρουτίνα σε assembly του MIPS. struct bst_node { unsigned int key; struct bst_node *left, *right; } bst_node_t; bst_node_t *bst_lookup(bst_node *root, unsigned int key) { if (root == NULL) return root; if (key == root->key) return root; struct bst_node *next = NULL; if (key < root->key) next = root->left; else next = root->right; } return bst_lookup(next, key); ΜΕΡΟΣ Δ (i) Δίνεται ο παρακάτω πίνακας με τα δεδομένα που βρίσκονται στη μνήμη για τις θέσεις 0x1000-0x109F.
Διεύθυνση Bytes (hex) 0x1000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x1010 FF 00 FF 00 FF 00 00 00 00 00 00 08 FF 00 00 FF 0x1020 FF 00 01 09 FF 00 FF 00 03 00 00 00 00 FF 00 FF 0x1030 FF FF 00 00 00 00 00 00 00 FF 00 00 00 00 00 FF 0x1040 FF 00 00 00 07 04 00 00 00 00 00 00 FF 00 FF FF 0x1050 FF 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00 FF 0x1060 FF 00 FF 00 FF 00 00 00 00 FF 00 00 FF 00 00 FF 0x1070 FF 00 00 FF 00 00 00 00 00 00 00 00 00 00 00 FF 0x1080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 0x1090 03 01 01 03 03 01 01 01 04 01 04 01 04 01 01 01 Οι θέσεις μνήμης 0x1000-0x108F αντιπροσωπεύουν το δισδιάστατο πλέγμα (16x9 στη συγκεκριμένη περίπτωση) του παιχνιδιού Bomberman. Το παιχνίδι παίζεται ως εξής: Ο bomberman ξεκινάει από το σημείο (1,1) του πλέγματος (διεύθυνση 0x1011 στο συγκεκριμένο πλέγμα). Προχωράει ένα βήμα την φορά προς οποιαδήποτε κατεύθυνση. Τα σημεία με τιμή 0xFF είναι οι βόμβες, στις οποίες αν πέσει ο bomberman το παιχνίδι τελειώνει. Για κάθε σημείο με τιμή 0x01-0x09 που συναντά, ο bomberman παίρνει τόσους πόντους όσους η τιμή του σημείου, την οποία και αλλάζει σε 0. Τα όρια του grid είναι ΠΑΝΤΑ βόμβες. Στις θέσεις μνήμης 0x1090-0x109F είναι αποθηκευμένες οι κινήσεις τις οποίες θα κάνει ο bomberman. Οι δυνατές κινήσεις είναι: 0x01 => μετακίνηση δεξιά. 0x02 => μετακίνηση αριστερά. 0x03 => μετακίνηση κάτω. 0x04 => μετακίνηση πάνω. Υλοποιήστε τη διαδικασία (procedure) bomberman σε assembly MIPS η οποία εκτελεί τις κινήσεις του bomberman. Η διαδικασία θα πρέπει να δέχεται τα εξής ορίσματα: στον $a0 ένα δείκτη στη μνήμη στο σημείο όπου είναι αποθηκευμένο το δισδιάστατο πλέγμα (0x1000 στο συγκεκριμένο παράδειγμα). στον $a1 το μήκος του grid (16 στο συγκεκριμένο παράδειγμα). στον $a2 ένα δείκτη στη μνήμη στο σημείο όπου είναι αποθηκευμένες οι κινήσεις που θα εκτελέσει ο bomberman (0x1090 στο συγκεκριμένο παράδειγμα). στον $a3 τον αριθμό των κινήσεων (16 στο συγκεκριμένο παράδειγμα). Τέλος η διαδικασία επιστρέφει ως αποτέλεσμα στον καταχωρητή $v0 το σύνολο των πόντων που μάζεψε ο bomberman ή -1 σε περίπτωση που έχει πέσει σε σημείο που περιέχει βόμβα. (ii) Εκτελέστε τη διαδικασία που υλοποιήσατε με βάση τα περιεχόμενα της μνήμης που δίνονται στον πιο πάνω πίνακα. Ποιά είναι η τιμή που επιστρέφει η συνάρτηση;
Για την υλοποίηση της άσκησης μπορείτε να χρησιμοποιήσετε τον MSIM, ένα emulator του MIPS οποίος αναπτύχθηκε από συμφοιτητές σας και διατίθεται από το εργαστήριο Υπολογιστικών Συστημάτων (CSLab). Στον emulator αυτό, μπορείτε να γράφετε MIPS assembly και να την εκτελείτε παρακολουθώντας τα περιεχόμενα των καταχωρητών και της μνήμης καθιστώντας έτσι ευκολότερη την παραγωγή και τον έλεγχο του απαιτούμενου κώδικα. Τον MSIM μπορείτε να τον κατεβάσετε από τη σελίδα των ασκήσεων του site του μαθήματος. Παραδοτέο της άσκησης θα είναι ένα ηλεκτρονικό κείμενο (pdf, docx ή odt) που θα περιέχει τους κώδικες assembly και των 3 μερών της άσκησης. Ο κώδικας θα πρέπει να περιέχει αναλυτικά σχόλια για την κατανόηση της λύσης σας από τους διδάσκοντες. Στο ηλεκτρονικό κείμενο να αναφέρετε στην αρχή τα στοιχεία σας (Όνομα, Επώνυμο, ΑΜ). Η άσκηση θα παραδοθεί ηλεκτρονικά στην ιστοσελίδα: http://www.cslab.ece.ntua.gr/courses/comparch/submit-tmima1 Δουλέψτε ατομικά. Έχει ιδιαίτερη αξία για την κατανόηση του μαθήματος να κάνετε μόνοι σας την εργασία. Μην προσπαθήσετε να την αντιγράψετε από άλλους συμφοιτητές σας.