ΜΥΥ- 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