Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 2 Εντολές : Η γλώσσα του υπολογιστή (συνέχεια) Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση), μετάφραση: Καθ. Εφαρμογών Νικόλαος Πετράκης, Τμήματος Ηλεκτρονικών Μηχανικών του Τ.Ε.Ι. Κρήτης. Τελευταία τροποποίηση: 2014-2015 χειμερινό εξάμηνο.
Μεταγλώττιση βρόχων (Loop) Κώδικας C: while (save[i]!= k) i++; Το i στο $s3, το k στο $s5, και η διεύθυνση του save στο $s6 Μεταγλωττισμένος κώδικας MIPS: Βασικά μπλοκ Θεωρείστε ότι ο πίνακας save είναι 32μπιτων ακεραίων. Loop: sll $t0, $s3, 2 add $t0,? $t0, $s6 lw $t1, 0($t0) beg $t1, $s5, Exit addi $s3, $s3, 1 j Loop Exit: Chapter 2 Instructions: Language of the Computer 2
Βασικά μπλοκ (Basic Blocks) Ένα βασικό μπλοκ είναι μια ακολουθία εντολών Χωρίς ενσωματωμένες διακλαδώσεις (εκτός από το τέλος της) και Χωρίς προορισμούς διακλάδωσης (branch targets) (εκτός από την αρχή) Οι μεταγλωττιστές, σε κάποια από τις πρώτες φάσεις της μεταγλώττισης, εντοπίζουν τα βασικά μπλοκ για βελτιστοποίηση Ένας εξελιγμένος επεξεργαστής μπορεί να επιταχύνει την εκτέλεση των βασικών μπλοκ Chapter 2 Instructions: Language of the Computer 3
Κι άλλες εντολές υπό συνθήκη Θέσε το αποτέλεσμα στο 1 εάν μια συνθήκη είναι αληθής Διαφορετικά, δώσε του τιμή μηδέν (0) slt rd, rs, rt if (rs < rt) rd = 1; else rd = 0; slti rt, rs, constant if (rs < constant) rt = 1; else rt = 0; Συνδυάζονται με τις εντολές beq, bne slt $t0, $s1, $s2 # if ($s1 < $s2) bne $t0, $zero, L # branch to L Chapter 2 Instructions: Language of the Computer 4
Σχεδίαση εντολών διακλάδωσης Γιατί όχι και blt, ble, bgt, bge, κλπ; Το υλικό (hardware) για τον έλεγχο ανισοτήτων (<,, ) είναι πιο αργό από αυτό που ελέγχει για ισότητα ή διαφορά (=, ) Συμπεριλαμβάνοντάς το σε μια διακλάδωση οδηγεί σε περισσότερη δουλειά ανά εντολή, που επιβάλει ρολόι με χαμηλότερη συχνότητα Επιβαρύνεται το σύνολο των εντολών! Οι beq και bne είναι η συχνή περίπτωση Αυτό είναι ένας καλός σχεδιαστικός συμβιβασμός Chapter 2 Instructions: Language of the Computer 5
Κι άλλο παράδειγμα βρόχου Κώδικας C: sum = 0; for(i=1; i<15; i++) sum = sum + i; Το sum στο $s1 και το i στο $s2. Μεταγλωττισμένος κώδικας MIPS: and $s1, $s1, $zero addi $s2,? $zero, 1 Loop: slti $t0, $s2, 15 beg $t0, $zero, Exit add $s1, $s1, $s2 addi $s2, $s2, 1 j Loop Exit: Chapter 2 Instructions: Language of the Computer 6
Με πρόσημο ή χωρίς (Signed vs. Unsigned) Σύγκριση με πρόσημο : slt, slti Σύγκριση χωρίς πρόσημο : sltu, sltui Παράδειγμα $s0 = 1111 1111 1111 1111 1111 1111 1111 1111 $s1 = 0000 0000 0000 0000 0000 0000 0000 0001 slt $t0, $s0, $s1 # signed 1 < +1 $t0 = 1 sltu $t0, $s0, $s1 # unsigned 4,294,967,295 < 1 $t0 = 0 Chapter 2 Instructions: Language of the Computer 7
Πολλαπλές διακλαδώσεις Οι περισσότερες γλώσσες προγραμματισμού έχουν κάποια εντολή case ή switch, που επιτρέπει την επιλογή μιας από πολλές εναλλακτικές επιλογές με κριτήριο μια μόνο τιμή. Ο απλούστερος τρόπος να γίνει αυτό είναι μέσω μιας σειράς ελέγχων συνθήκης (μια αλυσίδα από εντολές διακλάδωσης if-then-else) Μερικές φορές μπορούν να κωδικοποιηθούν πιο αποδοτικά ως πίνακας διευθύνσεων εναλλακτικών ακολουθιών εντολών, που ονομάζεται πίνακας διευθύνσεων άλματος (jump address table) Για την υποστήριξη τέτοιων περιπτώσεων ο MIPS περιλαμβάνει την εντολή jump register (jr) που εκτελεί άλμα χωρίς συνθήκη σε μια διεύθυνση που καθορίζεται από την τιμή ενός καταχωρητή. Chapter 2 Instructions: Language of the Computer 8
Κλήση Διαδικασιών (Procedure Calling) Απαιτούμενα βήματα 1. Τοποθέτηση των παραμέτρων (ορισμάτων) σε μέρος προσπελάσιμο από την διαδικασία (π.χ. στους καταχωρητές) 2. Μεταβίβαση του ελέγχου στην διαδικασία 3. Εξασφάλιση πόρων αποθήκευσης για τις ανάγκες της διαδικασίας 4. Εκτέλεση των πράξεων (λειτουργιών) της διαδικασίας 5. Τοποθέτηση των αποτελεσμάτων σε μέρος όπου το καλούν πρόγραμμα έχει πρόσβαση 6. Επιστροφή του ελέγχου στην αμέσως επόμενη εντολή από το σημείο κλήσης (μια διαδικασία μπορεί να κληθεί από διάφορα σημεία του προγράμματος) Chapter 2 Instructions: Language of the Computer 9
Χρήση καταχωρητών $a0 $a3: arguments (reg s 4 7) $v0, $v1: result values (reg s 2 and 3) $t0 $t9: temporaries Μπορούν να γραφούν από τον καλούμενο $s0 $s7: saved Πρέπει να αποθηκεύονται / επαναφέρονται από τον καλούμενο $gp: global pointer for static data (reg 28) $sp: stack pointer (reg 29) $fp: frame pointer (reg 30) $ra: return address (reg 31) (10 προσωρινοί καταχωρητές) ( 4 καταχωρητές ορίσματος) (2 καταχωρητές τιμής) (8 αποθηκευμένοι καταχωρητές) (Δείκτης στοίβας) (Δείκτης πλαισίου) (Καθολικός δείκτης) (Διεύθυνση επιστροφής) Chapter 2 Instructions: Language of the Computer 10
Εντολές κλήσης διαδικασίας Εντολή άλματος και σύνδεσης (jump and link) jal ProcedureLabel Κλήση διαδικασίας Αποθηκεύει την διεύθυνση της επόμενης εντολής στον καταχωρητή $ra Μεταφέρεται στην διεύθυνση στόχο (target address) Εντολή άλματος στην διεύθυνση που δίδεται από τον καταχωρητή (jump register) jr $ra Επιστροφή από διαδικασία Αντιγράφει τον $ra στον μετρητή προγράμματος (program counter) Επίσης, μπορεί να χρησιμοποιηθεί για υπολογισμένα άλματα (π.χ. σε εντολές πολλαπλών διακλαδώσεων) Chapter 2 Instructions: Language of the Computer 11
Παράδειγμα διαδικασίας-φύλλο Κώδικας σε C: int leaf_example(int g, int h, int i, int j) { int f; f = (g + h) - (i + j); return f; } Τα ορίσματα g, h, i και j βρίσκονται στους καταχωτητές $a0, $a1, $a2 και $a3 Το f στον $s0 (Συνεπώς, απαιτείται η αποθήκευση του $s0 στην στοίβα (stack)) Το αποτέλεσμα θα τοποθετηθεί στο $v0 Chapter 2 Instructions: Language of the Computer 12
Παράδειγμα διαδικασίας-φύλλο Κώδικας MIPS: leaf_example: addi $sp, $sp, -4 sw $s0, 0($sp) add $t0, $a0, $a1 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra Αποθήκευση του $s0 στην στοίβα Το σώμα της διαδικασίας Τοποθέτηση αποτελέσματος Αποκατάσταση του $s0 Επιστροφή Chapter 2 Instructions: Language of the Computer 13