ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών (ΗΜΜΥ) Λύσεις 1 ης Ενδιάμεσης Εξέτασης στο ΗΜΥ213 Χειμερινό Εξάμηνο, 2012 Διδάσκων: Γιώργος Ζάγγουλος Ημερομηνία εξέτασης: 09/02/2012 1. Δίνονται τα περιεχόμενα των καταχωρητών ως ακολούθως: $t6 = 0x1Β00F0Α1, $t7 = 0x0Β23706Ε. Εξηγήστε την εντολή andi $t6, $t7, 0xC5 και υπολογίστε τα περιεχόμενα του καταχωρητή στον οποίο θα αποθηκευτεί το αποτέλεσμα. Το περιεχόμενο του $t7 θα γίνει AND με την τιμή 0xC5 και το αποτέλεσμα θα πάει στον $t6. 0B 23 70 6E 0110 1110 00 00 00 C5 AND 1100 0101 AND --------------- --------------- 00 00 00?? 0100 0100 $t7 = 0x00000044 2. Εξηγήστε την εντολή xor $t3, $t4, $t5 και υπολογίστε τα περιεχόμενα του καταχωρητή στον οποίο θα αποθηκευτεί το αποτέλεσμα. Δίνονται τα αρχικά περιεχόμενα των καταχωρητών ως ακολούθως: $t3 = 0x00F600Α0, $t4 = 0x7897Β800, $t5 = 0x0000780Α Το περιεχόμενο του $t4 θα γίνει XOR με τo περιεχόμενο του $t5 και το αποτέλεσμα θα πάει στον $t3. 78 97 B8 00 1011 1000 00 00 78 0Α XOR 0111 1000 XOR --------------- --------------- 78 97?? 0A 1100 0000 $t3 = 0x7897C00A 3. Εξηγήστε την εντολή div $t5, $t4 εάν τα περιεχόμενα των καταχωρητών πριν την εκτέλεση της είναι ως ακολούθως: $t4 = 0x00000003 και $t5 = 0x0000001C. Ποιο θα είναι το αποτέλεσμα (και το υπόλοιπο) και που θα αποθηκευτεί; (Δώστε συγκεκριμένες τιμές.) Το περιεχόμενο του $t5 θα διαιρεθεί με τo περιεχόμενο του $t4 και το αποτέλεσμα θα πάει στον καταχωρητή lo ενώ το υπόλοιπο από την διαίρεση στον καταχωρητή hi. 0x1C/0x3 = 28/3 = 9 και υπόλοιπο 1 lo = 9, hi = 1 4. Γράψτε τις εντολές με τις οποίες μπορείτε να ανιχνεύσετε την τιμή του δυαδικού ψηφίου στη θέση 5 της θέσης μνήμης 0x12345678 εάν το λιγότερο σημαντικό ψηφίο βρίσκεται στη θέση 0. lb $t1, 0x12345678 andi $t1, $t1, 0x20 beqz $t1, was_zero 5. Ποιο θα είναι το περιεχόμενο του καταχωρητή αποτελέσματος μετά την εκτέλεση της εντολής sll $t5, $t4, 16 εάν τα περιεχόμενα στους καταχωρητές πριν την εκτέλεση είναι: $t4 = 0x03706Β2Ε και $t5 = 0x00F0Α012; O $t4 << 16 μπιτς αριστερά και το αποτέλεσμα θα πάει στον $t5. $t5= 0x6Β2Ε0000 1
6. Δίνονται οι ακόλουθες εντολές:.data input:.byte 20, 25, 30, 49, 3, 56.text main: li $t3, 0 lb $t5, input +2($t3) Δώστε το περιεχόμενο του $t5 (ως 32 μπιτ) μετά την εκτέλεση των πιο πάνω εντολών. Το περιεχόμενο του $t5 θα γίνει ίσο με τον αριθμό της λίστας input που βρίσκεται στη θέση μνήμης input + 2+0 = input + 2. Άρα, $t5 = 30 = 0x1E = 0000 0000 0000 0000 0000 0000 0001 1110 7. Εξηγήστε σε τι χρησιμεύει ο $pc και περιγράψτε τη λειτουργία του κατά τη ροή ενός προγράμματος. O καταχωρητής $PC είναι ο μετρητής προγράμματος. Δείχνει πάντοτε στην θέση όπου είναι αποθηκευμένο το πρώτο byte (LSB) της επόμενης εντολής προς εκτέλεση. Μετά από κάθε προσκόμιση εντολής στην κεντρική μονάδα επεξεργασίας ο $PC αυξάνει αρχικά πάντοτε +4 λόγω του ότι οι εντολές στον ΜΙΠΣ-32 χρειάζονται 4 θέσεις μνήμης για να αποθηκευτούν. 8. Δίνονται τα περιεχόμενα των καταχωρητών και της μνήμης ως ακολούθως: $t0 = 0x50000000 $t1=0xαβ012345 $t2=0xαβcdef01 0x50000000: 0x8A 0x50000001: 0x65 0x50000002: 0x21 0x50000003: 0x3Β Δείξτε τι θα αλλάξει μετά από κάθε εντολή αν η κάθε εντολή εκτελείται ανεξάρτητα: (15 μονάδες) lb $t3, 0x50000003 li $t4, 0x50000001 la $t8, 0x50000000 lw $t5, ($t0) sb $t0, 5($t1) sw $t1, 0x60000002 move $t2, $t1 $t3 = 0x3B $t4 = 0x50000001 $t8 = 0x50000000 $t5 = 0x3B21658A Memory address: 0xAB01234A = 0x00 Memory address: 0x60000002/3/4/5 = 0x45 23 01 AB $t2 = 0xAB012345 2
9. Πόσα και ποια είναι τα ορίσματα στην πιο κάτω εντολή (γραμμένη στο terminal σε Linux); Εξηγήστε που θα βρείτε την αρχική διεύθυνση του 2ου ορίσματος της πιο κάτω εντολής; Δώστε τις απαραίτητες εντολές με τις οποίες ο προγραμματιστής μπορεί να ελέγξει αν έχει δοθεί ο σωστός αριθμός ορισμάτων και στη συνέχεια να φορτώσει το 1 ο byte του δεύτερου ορίσματος στον $t1, το 2 ο byte του 2 ου ορίσματος στον $t2 και το 3 ο byte του 2 ου ορίσματος στον $t3. Απαντήστε στα πιο πάνω αν η εντολή στο terminal είναι: spim file week5.s 563 472 (15 μονάδες) Τα ορίσματα στην εντολή spim file week5.s 365 472 είναι 3. 1) το όνομα του αρχείου «week5.s» 2) το 365 (ως 3 χαρακτήρες ascii 0x35, 0x36 και 0x33) 3) το 472 (ως 3 χαρακτήρες ascii 0x34, 0x37 και 0x32) Η αρχική διεύθυνση του 2 ου ορίσματος βρίσκεται αποθηκευμένη σε 4 συνεχόμενες θέσεις μνήμης των οποίων η πρώτη είναι αποθηκευμένη στις θέσεις που δείχνει ο καταχωρητής α1+4, α1+5, α1+6 και α1+7. Με την εντολή lw $t0, 4($a1), o $t0 παίρνει την αρχική διεύθυνση του 2 ου ορίσματος. 1. bne $a0, 3, lathos_orismata # αν το πλήθος των ορισμάτων δεν είναι 3, τότε έγινε λάθος 2. lw $t0, 4($a1), 3. lb $t1, 0($t0) 4. lb $t2, 1($t0) 5. lb $t3, 2($t0) lathos_orisma : 10. Γράψτε ένα μικρό πρόγραμμα με το οποίο μπορείτε να αφαιρέσετε το περιεχόμενο της θέσης μνήμης 0x30000000 από το περιεχόμενο της θέσης μνήμης 0x3000000Α και αυτό της 0x30000001 από αυτό που βρίσκεται στην διεύθυνση 0x3000000Β. Τα 2 αποτελέσματα πρέπει να αποθηκευτούν στις θέσεις μνήμης 0x30000005 και 0x30000006 αντίστοιχα. Η υλοποίηση πρέπει να γίνει με βρόχο επανάληψης (για τις 2 αφαιρέσεις/αποθηκεύσεις) για να πάρετε όλες τις μονάδες. Χωρίς βρόχο, θα δοθούν 10/15 μονάδες αν είναι σωστός ο κώδικας σας. (15 μονάδες) 1. la $t0, 0x30000000 # memory pointer 2. li $t4, 0 # loop counter 3. next_sub: 4. beq $t4, 2, exit_sub # when $t4 = 2, exit loop 5. lb $t1, 10($t0) 6. lb $t2, ($t0) 7. sub $t3, $t1, $t2 8. sb $t3, 5($t0) 9. addi $t0, $t0, 1 10. addi $t4, $t4, 1 11. b next_sub 12. exit_sub: 3
13. Ένα πρόγραμμα αρχικά ανοίγει κάποιο αρχείο (text file) και αποθηκεύει το περιεχόμενο του στη μνήμη αρχίζοντας από την διεύθυνση με ετικέτα characters (προς τα κάτω με -1). Μετά την αποθήκευση του στη μνήμη, το αρχείο κλείνει με κλήση συστήματος 16. Καλείστε λοιπόν να γράψετε ένα πρόγραμμα με την χρήση βρόχου, το οποίο να μετατρέψει το περιεχόμενο του text file (που βρίσκεται τώρα στη μνήμη) σε ακέραιους αριθμούς και να αποθηκεύσει αυτούς τους αριθμούς σε μια λίστα η οποία έχει δηλωθεί ως arithmoi:.byte 0, 0, 0, 0, 0, 0. Προσοχή! Αν κάποιος αριθμός δεν μπορεί να αποθηκευτεί σωστά στη λίστα, τότε σε αυτή τη θέση (της λίστας arithmoi) θα παραμένει το 0 και θα τυπώνεται ανάλογο μήνυμα. Το περιεχόμενο του αρχείου είναι: 56/8/32/462/9/] (20 μονάδες) 1. la $t0, characters 2. la $t5, arithmoi 3. li $t1, 10 4. li $t2, 0 5. atoi : 6. lb $t4, ($t0) 7. beq $t4, 47, save_number 8. beq $t4, 93, exit_atoi 9. sub $t4, $t4, 0x30 10. mul $t2, $t2, $t1 11. add $t2, $t2, $t4 12. addi $t0, $t0, -1 13. b atoi 14. save_num : 15. bgt $t2, 255, num_error 16. sb $t2, ($t5) 17. b skip_error 18. num_error : 19. li $v0, 4 20. la $a0, error1 21. syscall 22. skip_error : 23. addi $t5, $t5, 1 24. addi $t0, $t0, -1 25. li $t2, 0 26. b atoi 27. exit_atoi : 4
5