Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 2 Εντολές : Η γλώσσα του υπολογιστή (συνέχεια) Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση), μετάφραση: Καθ. Εφαρμογών Νικόλαος Πετράκης, Τμήματος Ηλεκτρονικών Μηχανικών του Τ.Ε.Ι. Κρήτης. Τελευταία τροποποίηση: 2014-2015 χειμερινό εξάμηνο.
Ένθετες διαδικασίες (Non-Leaf) Διαδικασίες που καλούν άλλες διαδικασίες Για φωλιασμένες κλήσεις, ο καλών, πριν από την κλήση, πρέπει να αποθηκεύει στην στοίβα: Την διεύθυνση επιστροφής του ($ra), και Όποιο όρισμα ($a0 - $a3) ή προσωρινό ($t0 - $t9) δεδομένο χρειάζεται μετά την κλήση. Τα επαναφέρει από την στοίβα μετά την κλήση Ο καλούμενος, πρέπει να αποθηκεύει στην στοίβα: Όποιους αποθηκευμένους καταχωρητές ($s0 - $s7) χρησιμοποιεί ο ίδιος. Ο δείκτης στοίβας ($sp) ρυθμίζεται διαρκώς. Chapter 2 Instructions: Language of the Computer 2
Παράδειγμα ένθετης διαδικασίας Κώδικας σε C: int fact (int n) { if (n < 1) } return 1; else return n * fact(n - 1); Το όρισμα βρίσκεται στον $a0 Το αποτέλεσμα θα τοποθετηθεί στον $v0 Chapter 2 Instructions: Language of the Computer 3
Non-Leaf Procedure Example Κώδικας MIPS: fact: addi $sp, $sp, -8 # Προετοιμασία στοίβας sw $ra, 4($sp) # Αποθήκευση διεύθ. επιστρ. sw $a0, 0($sp) # Αποθήκευση ορίσματος slti $t0, $a0, 1 # έλεγχος για n < 1, και αν beq $t0, $zero, L1 # δεν ισχύει, άλμα στο L1 addi $v0, $zero, 1 # εάν ναι, αποτέλεσμα 1 addi $sp, $sp, 8 # αποκατάσταση στοίβας jr $ra # και επιστροφή L1: addi $a0, $a0, -1 # αλλιώς μείωσε κατά 1 το n jal fact # αναδρομική κλήση lw $a0, 0($sp) # Επαναφορά του αρχικού n lw $ra, 4($sp) # και της διεύθ. επιστροφής addi $sp, $sp, 8 # Αποκατάσταση στοίβας mul $v0, $a0, $v0 # Πολλαπλασιασμός jr $ra # και επιστροφή Chapter 2 Instructions: Language of the Computer 4
Κατανομή χώρου στην στοίβα Τοπικά δεδομένα τοποθετημένα από τον καλούμενο π.χ. αυτόματες (τοπικές) μεταβλητές της C Πλαίσιο Διαδικασίας (procedure frame) ή εγγραφή ενεργοποίησης (activation record) Χρησιμοποιείται από κάποιους μεταγλωττιστές για ευκολότερη διαχείριση των αποθηκευμένων δεδομένων στην στοίβα Chapter 2 Instructions: Language of the Computer 5
Κατανομή μνήμης του MIPS Τμήμα κειμένου (text segment): κώδικας μηχανής Τμήμα στατικών δεδομένων (static data): καθολικές μεταβλητές π.χ. στατικές μεταβλητές στην C, πίνακες (arrays) και συμβολοσειρές (strings) Το $gp αρχικοποιείται σε μια τιμή που διευκολύνει την προσπέλαση των δεδομένων με 16μπιτες σχετικές αποστάσεις (±offsets) Δυναμικά δεδομένα (dynamic data): σωρός (heap) π.χ. στην C, κατανομή χώρου με malloc() και ελευθέρωση με free() Στοίβα (stack):αυτόμ. μεταβλητές Chapter 2 Instructions: Language of the Computer 6
Χαρακτήρες (Character Data) Σύνολα χαρακτήρων στα 8 bit (1 Byte) ASCII Latin-1 Unicode: στα 32-bit Χρησιμοποιείται στην Java, στην C++, Συμπεριλαμβάνει τα αλφάβητα των περισσότερων ανθρώπινων γλωσσών, συν σύμβολα UTF-8, UTF-16: κωδικοποιήσεις μεταβλητού μήκους Chapter 2 Instructions: Language of the Computer 7
Πράξεις με bytes και ημιλέξεις Μπορούν να χρησιμοποιηθούν πράξεις ανά bit Η φόρτωση/αποθήκευση byte/halfword στον MIPS Συχνή περίπτωση στην επεξεργασία συμβολοσειρών lb rt, offset(rs) lh rt, offset(rs) Με επέκταση πρόσημου στα 32 bit του rt lbu rt, offset(rs) lhu rt, offset(rs) Με επέκταση του μηδενός στα 32 bit του rt sb rt, offset(rs) sh rt, offset(rs) Αποθηκεύει μόνο το δεξιότερο byte/halfword Chapter 2 Instructions: Language of the Computer 8
Παράδειγμα με συμβολοσειρές Κώδικας σε C (αντιγραφή του y στο χ): void strcpy (char x[], char y[]) { int i; i = 0; while ((x[i]=y[i])!='\0') i += 1; } return; Οι διευθύνσεις των x, y είναι στους $a0, $a1 και του i στο $s0 Chapter 2 Instructions: Language of the Computer 9
Παράδειγμα με συμβολοσειρές Κώδικας MIPS: strcpy: addi $sp, $sp, -4 # προετοίμασε την στοίβα sw $s0, 0($sp) # αποθήκευσε τον $s0 add $s0, $zero, $zero # i = 0 L1: add $t1, $s0, $a1 # η διευθ.του y[i] στο $t1 lbu $t2, 0($t1) # $t2 = y[i] add $t3, $s0, $a0 # η διευθ.του x[i] στο $t3 sb $t2, 0($t3) # x[i] = y[i] beq $t2, $zero, L2 # έξοδος αν y[i] == 0 addi $s0, $s0, 1 # i = i + 1 j L1 # επόμενη επανάληψη βρόχου L2: lw $s0, 0($sp) # αποκατάσταση του $s0 addi $sp, $sp, 4 # αποκατάσταση της στοίβας jr $ra # και επιστροφή Chapter 2 Instructions: Language of the Computer 10
Σταθερές στα 32-bit Οι περισσότερες σταθερές είναι μικρές 16-bit άμεσα (immediate) είναι αρκετά Για την περίπτωση σταθερών στα 32 bit lui rt, constant Αντιγράφει μια σταθερά 16-bit στα 16 αριστερότερα δυαδικά ψηφία του rt load upper immediate Επαναφέρει τα 16 δεξιότερα bit του rt στο 0 lui $s0, 61 0000 0000 0011 1101 0000 0000 0000 0000 ori $s0, $s0, 2304 0000 0000 0011 1101 0000 1001 0000 0000 Chapter 2 Instructions: Language of the Computer 11