ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών (ΗΜΜΥ) Λύσεις 1 ης Ενδιάμεσης Εξέτασης στο ΗΜΥ213 Χειμερινό Εξάμηνο, 2012 Διδάσκων: Γιώργος Ζάγγουλος Ημερομηνία εξέτασης: 09/02/2012 1. Γράψτε τις εντολές με τις οποίες μπορείτε να ανιχνεύσετε την τιμή του δυαδικού ψηφίου στη θέση 6 της θέσης μνήμης 0x23456791 εάν το λιγότερο σημαντικό ψηφίο βρίσκεται στη θέση 0. lb $t1, 0x23456791 andi $t1, $t1, 0x40 beqz $t1, was_zero 1. Ποιο θα είναι το περιεχόμενο του καταχωρητή αποτελέσματος μετά την εκτέλεση της εντολής srl $t4, $t5, 12 εάν τα περιεχόμενα στους καταχωρητές πριν την εκτέλεση είναι: $t4 = 0x03706Β2Ε και $t5 = 0x00F0Α012; O $t5 >> 12 μπιτς δεξιά και το αποτέλεσμα θα πάει στον $τ4. $τ4= 0x00000F0A 2. Δίνονται τα περιεχόμενα των καταχωρητών ως ακολούθως: $t6 = 0x1Β00F0Α1, $t7 = 0x0Β23706Ε. Εξηγήστε την εντολή andi $t7, $t6, 35 και υπολογίστε τα περιεχόμενα του καταχωρητή στον οποίο θα αποθηκευτεί το αποτέλεσμα. Το περιεχόμενο του $t6 θα γίνει AND με την τιμή 35 (=0x23) και το αποτέλεσμα θα πάει στον $t7. 1B 00 F0 A1 1010 0001 00 00 00 23 AND 0010 0011 AND --------------- --------------- 00 00 00?? 0010 0001 $t7 = 0x00000021 3. Εξηγήστε την εντολή xor $t5, $t4, $t3 και υπολογίστε τα περιεχόμενα του καταχωρητή στον οποίο θα αποθηκευτεί το αποτέλεσμα. Δίνονται τα αρχικά περιεχόμενα των καταχωρητών ως ακολούθως: $t3 = 0x00F600Α0, $t4 = 0x7897Β800, $t5 = 0x0000780Α Το περιεχόμενο του $t3 θα γίνει XOR με τo περιεχόμενο του $t4 και το αποτέλεσμα θα πάει στον $t5. 00 F6 00 A0 1111 0110 78 97 B8 00 XOR 1001 0111 XOR --------------- --------------- 78?? B8 A0 0110 0001 $t5 = 0x7861B8A0 4. Εξηγήστε την εντολή div $t5, $t4 εάν τα περιεχόμενα των καταχωρητών πριν την εκτέλεση της είναι ως ακολούθως: $t4 = 0x00000007 και $t5 = 0x0000001b. Ποιο θα είναι το αποτέλεσμα (και το υπόλοιπο) και που θα αποθηκευτεί; (Δώστε συγκεκριμένες τιμές.) Το περιεχόμενο του $t5 θα διαιρεθεί με τo περιεχόμενο του $t4 και το αποτέλεσμα θα πάει στον καταχωρητή lo ενώ το υπόλοιπο από την διαίρεση στον καταχωρητή hi. 0x1Β/0x7 = 27/7 = 3 και υπόλοιπο 6 lo = 3, hi = 6 1
5. Δίνονται οι ακόλουθες εντολές:.data input:.byte 20, 25, 30, 49, 3, 56.text main: li $t3, 0x2 lb $t6, input +1($t3) Δώστε το περιεχόμενο του $t6 (ως 32 μπιτ) μετά την εκτέλεση των πιο πάνω εντολών. Το περιεχόμενο του $t6 θα γίνει ίσο με τον αριθμό της λίστας input που βρίσκεται στη θέση μνήμης input + 1+2 = input + 3. Άρα, $t6 = 49 = 0x31 = 0000 0000 0000 0000 0000 0000 0011 0001 6. Εξηγήστε σε τι χρησιμεύει ο $pc και περιγράψτε τη λειτουργία του κατά τη ροή ενός προγράμματος. O καταχωρητής $PC είναι ο μετρητής προγράμματος. Δείχνει πάντοτε στην θέση όπου είναι αποθηκευμένο το πρώτο byte (LSB) της επόμενης εντολής προς εκτέλεση. Μετά από κάθε προσκόμιση εντολής στην κεντρική μονάδα επεξεργασίας ο $PC αυξάνει αρχικά πάντοτε +4 λόγω του ότι οι εντολές στον ΜΙΠΣ-32 χρειάζονται 4 θέσεις μνήμης για να αποθηκευτούν. 7. Δίνονται τα περιεχόμενα των καταχωρητών και της μνήμης ως ακολούθως: $t0 = 0x50000000 $t1=0xαβ012345 $t2=0xαβcdef01 0x50000000: 0x78 0x50000001: 0x56 0x50000002: 0x12 0x50000003: 0xΒ2 Δείξτε τι θα αλλάξει μετά από κάθε εντολή αν η κάθε εντολή είναι ανεξάρτητη: (15 μονάδες) lb $t3, 0x50000001 $t3 = 0x56 li $t4, 0x50000003 $t4 = 0x50000003 la $t8, 0x50000000 $t8 = 0x50000000 lw $t6, ($t0) $t6 = 0xB2125678 sb $t2, 2($t1) Memory address: 0xAB012347 = 0x01 sw $t1, 0x50000008 Memory address: 0x50000008/9/A/B = 0x45 23 01 AB move $t2, $t1 $t2 = 0xAB012345 8. Πόσα και ποια είναι τα ορίσματα στην πιο κάτω εντολή (γραμμένη στο terminal σε Linux); Εξηγήστε που θα βρείτε την αρχική διεύθυνση του 2ου ορίσματος της πιο κάτω εντολής; Δώστε τις απαραίτητες εντολές με τις οποίες ο προγραμματιστής μπορεί να ελέγξει αν έχει δοθεί ο σωστός αριθμός ορισμάτων και στη συνέχεια να φορτώσει το 1 ο byte του δεύτερου ορίσματος στον $t1, το 2 ο byte του 2 ου ορίσματος στον $t2 και το 3 ο byte του 2 ου ορίσματος στον $t3. Απαντήστε στα πιο πάνω αν η εντολή στο terminal είναι: spim file week5.s 365 472 (15 μονάδες) Τα ορίσματα στην εντολή spim file week5.s 365 472 είναι 3. 1) το όνομα του αρχείου «week5.s» 2) το 365 (ως 3 χαρακτήρες ascii 0x33, 0x36 και 0x35) 3) το 472 (ως 3 χαρακτήρες ascii 0x34, 0x37 και 0x32) 2
Η αρχική διεύθυνση του 2 ου ορίσματος βρίσκεται αποθηκευμένη σε 4 συνεχόμενες θέσεις μνήμης των οποίων η πρώτη είναι αποθηκευμένη στις θέσεις που δείχνει ο καταχωρητής α1+4, α1+5, α1+6 και α1+7. Με την εντολή lw $t0, 4($a1), o $t0 παίρνει την αρχική διεύθυνση του 2 ου ορίσματος. 1. bne $a2, 3, lathos_orismata # αν το πλήθος των ορισμάτων δεν είναι 3, τότε έγινε λάθος 2. lw $t0, 4($a1), 3. lb $t1, 0($t0) 4. lb $t2, 1($t0) 5. lb $t3, 2($t0) 6. lathos_orisma : 9. Γράψτε ένα μικρό πρόγραμμα με το οποίο μπορείτε να αφαιρέσετε το περιεχόμενο της θέσης μνήμης 0x30000001 από το περιεχόμενο της θέσης μνήμης 0x3000000B και αυτό της 0x30000002 από αυτό που βρίσκεται στην διεύθυνση 0x3000000C. Τα 2 αποτελέσματα πρέπει να αποθηκευτούν στις θέσεις μνήμης 0x30000004 και 0x30000005 αντίστοιχα. Η υλοποίηση πρέπει να γίνει με βρόχο επανάληψης (για τις 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, 11($t0) 6. lb $t2, 1($t0) 7. sub $t3, $t1, $t2 8. sb $t3, 4($t0) 9. addi $t0, $t0, 1 10. addi $t4, $t4, 1 11. b next_sub 12. exit_sub: 3
11. Ένα πρόγραμμα αρχικά ανοίγει κάποιο αρχείο (text file) και αποθηκεύει το περιεχόμενο του στη μνήμη αρχίζοντας από την διεύθυνση με ετικέτα xaraktires (προς τα κάτω με -1). Μετά την αποθήκευση του στη μνήμη το αρχείο κλείνει με κλήση συστήματος 16. Καλείστε λοιπόν να γράψετε ένα πρόγραμμα με την χρήση βρόχου, το οποίο να μετατρέψει το περιεχόμενο του text file (που βρίσκεται τώρα στη μνήμη) σε ακέραιους αριθμούς και να αποθηκεύσει αυτούς τους αριθμούς σε μια λίστα η οποία έχει δηλωθεί ως items:.byte 0, 0, 0, 0, 0, 0. Προσοχή! Αν κάποιος αριθμός δεν μπορεί να αποθηκευτεί σωστά στη λίστα, τότε σε αυτή τη θέση (της λίστας items) θα παραμένει το 0 και θα τυπώνεται ανάλογο μήνυμα. Το περιεχόμενο του αρχείου είναι: 23/4/32/542/3/] (20 μονάδες) 1. la $t0, xaraktires 2. la $t5, items 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