ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Αρχιτεκτονική Υπολογιστών Αρχιτεκτονικό σύνολο εντολών Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly Αρης Ευθυμίου
Το σημερινό μάθημα! Σύνταξη εντολών! Θέματα σχετικά με τη προσπέλαση, οργάνωση μνήμης διευθύνση για κάθε byte διευθύνσεις λέξεων ευθυγράμμιση Big/LiNle Endian παραλλαγή της lw που είναι ψευτοεντολή! Συγκρίσεις & διακλαδόσεις if- then- else while σύγκρίσεις ανισότητας 2
Σύνταξη εντολών πράξη προορισμός, 1η πηγή, 2η πηγή! Η μορφή των εντολών είναι άκαμπτη (rigid): πάντα μία πράξη, 3 τελεσταίοι (operands) 1ος τελεσταίος είναι ο προορισμός (descnacon operand) 2ος τελεσταίος είναι η 1η πηγή (1st source operand) 3ος τελεσταίος είναι η 2η πηγή (2nd source operand) η σειρά των πηγών έχει σημασία για πράξεις όπως η αφαίρεση 3
Σταθερές! Αγγλικό όρος (ειδικά για assembly): immediate άμεσα διαθέσιμες τιμές δεν χρειάζεται καν ανάγνωση καταχωρητή! MIPS: εντολές με μία σταθερά αντί για καταχωρητή πηγής! Οι σταθερές είναι σχετικά μικρές 16 bit σε κάποιες εντολές μπορεί να είναι και αρνητικοί αριθμοί addi $t0, $t0, - 1 # t0 = t0-1 4
Διευθύνσεις μνήμης! Η μνήμη θεωρείται ότι είναι ένας τεράστιος πίνακας! Ο MIPS εσωτερικά δουλεύει με λέξεις (word) 32 bit! Aλλά χρειαζόμαστε τη δυνατότητα να διαβάζουμε/ γράφουμε bytes (8bit) για «μικρά» δεδομένα: χαρακτήρες, boolean,! Συμπεράσματα οι διευθύνσεις μνήμης είναι σε bytes! αλλιώς: κάθε byte της μνήμης έχει ξεχωριστή διεύθυνση υπάρχει δυνατότητα απευθείας προσπέλασης και για bytes και για λέξεις 5
Μνήμη: προσπέλαση λέξης! Ποιά είναι η διεύθυνση μιας λέξης στη μνήμη; η διεύθυνση του πρώτου byte της λέξης! Εστω μία λέξη στη διεύθυνση Α. Ποιά είναι η διεύθυνση της επόμενης λέξης; A + 4 όχι Α + 1! Πολύ συνηθισμένο λάθος. 6
Endianess bit 31 4 Big Endian 5 6 word 4 bit 0 7 0 1 2 3 byte0 byte1 byte2 byte3 bit 31 7 Little Endian 6 5 word 4 bit 0 4 3 2 1 0 byte3 byte2 byte1 byte0 figure source: wikipedia, endianess 7
Μνήμη: ευθυγράμμιση! Μπορώ να βάζω λέξεις σε όποια διεύθυνση μνήμης θέλω;! Στον MIPS, όχι πρέπει να είναι ευθυγραμμισμένες (aligned) οι διευθύνσεις πρέπει να είναι πολλαπλάσιες του 4 0 1 2 3 8
Σχηματισμός διεύθυνσης! Στον MIPS η διεύθυνση μνήμης υπολογίζεται από έναν καταχωρητή (η τιμή του ονομάζεται base address) μία σταθερά (ονομάζεται offset) η διεύθυνση (όνομα effeccve address) είναι το άθροισμα των τιμών των παραπάνω! Συμβολισμός: σταθερά (όνομα καταχωρητή) π.χ. 8($s3)! Δεν μπορούν να χρησιμοποιηθούν 2 καταχωρητές μπορεί να γίνει με επιπλέον εντολές μόνο! Δεν μπορεί να χρησιμοποιηθεί 1 σταθερά μόνο 9
Σύνταξη εντολών μεταφοράς πράξη 1ος καταχ., σταθερά(καταχ. βάσης)! Πράξη: lw (load word) ανάγνωση λέξης 32b από τη μνήμη sw (store word) εγγραφή λέξης 32b από τη μνήμη! 1ος καταχωρητής για load, εκεί θα αποθηκευτεί η τιμή για store, από εκεί θα διαβαστεί η τιμή! Παράδειγμα: lw $s0, 0xc($t1) # s0 = Mem[$t1+12] 10
Ψευτοεντολή lw! Δυστυχώς ο Mars επιτρέπει να χρησιμοποιηθεί η lw/lb... ως εξής: lw $s0, label! Αυτή η μορφή της lw είναι ψευτοεντολή αν κάνετε assemble θα δείτε 2 εντολές στο text segment: lui $at, 0x1001 # τα αριστερά 16 bit της διεύθυνσης lw $s0, 0008($at) # τα δεξιά 16 bit της διεύθυνσης! Η label είναι μια διεύθυνση μνήμης οι διευθύνσεις είναι μεγάλοι αριθμοί, χρειάζονται >16 bit Δεν μπορεί να γίνει με μία εντολή MIPS 11
Υπολογισμός διεύθυνσης! Μετάφραστε σε assembly g = a[i] g - $s1, i - $s2, a[] array λέξεων με βάση (a[0]) στον $s3! Ποιό είναι το offset; i (θέση πίνακα) 4 (bytes ανά θέση)! Περίπτωση 1: το i είναι σταθερά μέχρι 16 bit (μπορει να είναι < 0) έστω i = 8 lw $s1, 32($s3) # $s1 = a[8] 12
Υπολογισμός διεύθυνσης 2! Περίπτωση 2: το i είναι μεταβλητό και αντιστοιχεί π.χ. στον $s0 sll $t0, $s0, 2 # $t0 = i * 4 add $t0, $t0, $s3 # $t0 = $s3 + i *4 lw $s1, 32($t0) # $s1 = a[i] 13
Υπολογισμός διεύθυνσης 3! Περίπτωση 3 «δείκτης αντί για πίνακα» η προσπέλαση στοιχείων πίνακα γινεται με σταθερή σειρά, π.χ. αύξουσα κατά 1 στοιχείο add $t0, $s3, $zero # $t0 points to a[0] loop: lw $s0, 0($t0) # Note offset is 0 addi $t0, $t0, 4 # $t0 points to next # element of a[] 14
Δείκτες και δεδομένα! Ενας καταχωρητής κρατά οποιαδήποτε τιμή 32 bit μπορεί να είναι δείκτης στη μνήμη μπορεί να είναι ο αριθμός των φοιτητών στην τάξη! Και στις δύο περιπτώσεις έχουν νόημα αριθμητικές πράξεις διαφορετικό νόημα βέβαια!! Αλλά προσοχή: μη κάνετε προσπέλαση μνήμης χρησιμοποιώντας ως δείκτη καταχωρητή που περιέχει δεδομένα! Ο s0 πρέπει να είναι δείκτης: lw $t0, 0($s0) δεν υπάρχει κάτι (π.χ. Java interpreter) να πιάσει το λάθος 15
Εντολές διακλάδοσης! Κάνουν 2 «δουλειές»: 1. Ελεγχος απλής συνθήκης! μόνο ισότητα ή ανισότητα μεταξύ καταχωρητών 2.!!!! αν η συνθήκη δεν ισχύει, συνέχεια εκτέλεσης από την επόμενη εντολή, αλλιώς από μια άλλη διεύθυνση (δίνεται στην εντολή) beq r1, r2, target bne r1, r2, target Ολες οι υπόλοιπες παραλλαγές που επιτρέπει ο Mars είναι ψευτοεντολές και απαγορεύονται για τις ασκήσεις! Εντολή άλματος (jump), χωρίς συνθήκη j target 16
Παράδειγμα if (i == j) f = g+h else f = g- h i $s3 f $s0 g $s1 j $s4 h $s2 bne $s3, $s4, else add $s0, $s1, $s2 j skip else: sub $s0, $s1, $s2 skip:..... 17
Επαναλήψεις - loops! Δεν υπάρχουν ειδικές εντολές για επαναλήψεις υλοποιούνται με διακλαδώσεις, άλματα προς τα πίσω (πάνω) sum = 0 while (i!= 0) sum = sum + i i = i - 1 sum $s0 i $s1 add $s0, $zero, $zero loop: beq $s1, $zero, exitloop add $s0, $s0, $s1 addi $s1, $s1, - 1 j loop exitloop:..... 18
Συγκρίσεις ανισότητας! Μερικές φορές δεν αρκεί έλεγχος ισότητας ή ανισότητας αν και είναι ο πιο συνηθισμένος τύπος ελέγχου! Χρειάζεται να ελεγθεί αν ένας αριθμός είναι μικρότερος! Εντολή MIPS slt set on less than μη την μπερδεύετε με τις εντολές ολίσθησης (sll, srl) Σύνταξη: slt rdest, rsrc1, rsrc2 Αν τιμή του rsc1 < τιμή rsrc2, rdest " 1, αλλιώς rdest " 0 19
Διακλάδωση με συνθήκη < Μετατροπή σε assembly: if (g >= h) εντολή 1 εντολή 2 g $s0, h $s1 slt $t0, $s0, $s1 # t0 = (g < h) bne $t0, $zero, less # if (t0==1) goto less εντολή 1 less: εντολή 2 20
Συνθήκες ανισότητας! Δεν υπάρχει εντολή set if greater than απλά αλλάζει η σειρά των καταχωρητών if (g < h) εντολή 1 εντολή 2 slt $t0, $s0, $s1 # t0 = (g < h) beq $t0, $zero, geq # if (t0==0) goto geq εντολή 1 geq: εντολή 2 21
Εντολές MIPS, μέρος 1ο shi right arithmecc sra $s1, $s2, 10 22
Εντολές MIPS, μέρος 2ο Στο επόμενο μάθημα 23
Σύνοψη κωδικοποίηση εντολών I- Format: Εντολές με σταθερές (π.χ. addi), lw/sw,beq/bne Αλλά όχι για τις εντολές ολίσθησης (sll, srl, sra) Οι διακλαδόσεις χρησιμοποιούν PC- relacve addressing I: opcode rs rt immediate J- Format: j J: opcode target address R- Format: όλες οι υπόλοιπες εντολές R: opcode rs rt rd shamt funct 24
Επόμενο μάθημα MIPS assembly Συνέχεια Υποστήριξη υπορουτινών σε assembly, στοίβα 25
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου. «Αρχιτεκτονική Υπολογιστών. Αρχιτεκτονικό σύνολο εντολών». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http://ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https://creativecommons.org/licenses/by-sa/4.0/.