Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy Chapter 2 Εντολές : Η γλώσσα του υπολογιστή (συνέχεια) Διαφάνειες διδασκαλίας από το πρωτότυπο αγγλικό βιβλίο (4 η έκδοση), μετάφραση: Καθ. Εφαρμογών Νικόλαος Πετράκης, Τμήματος Ηλεκτρονικών Μηχανικών του Τ.Ε.Ι. Κρήτης. Τελευταία τροποποίηση: 2016-2017 χειμερινό εξάμηνο.
Διευθυνσιοδότηση σε διακλαδώσεις I-type Οι εντολές διακλάδωσης καθορίζουν (περιέχουν) Opcode, δύο καταχωρητές, διεύθυνση στόχο Οι περισσότεροι στόχοι διακλάδωσης είναι σε κοντινή απόσταση (near) Προς τα εμπρός (forward) ή προς τα πίσω (backward) op rs rt constant or address 6 bits 5 bits 5 bits 16 bits Διευθυνσιοδότηση σχετική ως προς PC (PCrelative addressing) Η διεύθυνση στόχος ισούται με PC + offset 4 Το PC είναι ήδη αυξημένο κατά 4 Chapter 2 Instructions: Language of the Computer 2
Διευθυνσιοδότηση σε άλματα Οι στόχοι των αλμάτων (j and jal) μπορεί να είναι οπουδήποτε στο τμήμα κειμένου J-type Κωδικοποίηση της πλήρους διεύθυνσης στην εντολή op address 6 bits 26 bits Ψευδο-απευθείας διευθυνσιοδότηση άλματος Η διεύθυνση στόχος = PC 31 28 : (address 4) Chapter 2 Instructions: Language of the Computer 3
Παράδειγμα διευθυνσιοδότησης στόχου Ο κώδικας του βρόχου από παλιότερο παράδειγμα while (save[i]!=k) $s3 i++; Θεωρείστε την διεύθυνση στόχο στην θέση 80000 Loop: sll $t1, $s3, 2 80000 0 0 19 9 2 0 add $t1, $t1, $s6 80004 0 9 22 9 0 32 lw $t0, 0($t1) 80008 35 9 8 0 beq $t0, $s5, Exit 80012 4 8 21 2 addi $s3, $s3, 1 80016 8 19 19 1 j Loop 80020 2 20000 Exit: 80024 $s6 $s5 Chapter 2 Instructions: Language of the Computer 4
Διακλάδωση πολύ μακριά (Far Away) Εάν ο στόχος διακλάδωσης είναι πολύ μακριά για να περιγραφεί με μια σχετική απόσταση των 16-bit (offset), ο συμβολομεταφραστής μετασχηματίζει τον κώδικα, από π.χ.: σε: L2_near: beq $s0,$s1, L1_far bne $s0,$s1, L2_near j L1_far Chapter 2 Instructions: Language of the Computer 5
Σύνοψη τρόπων διευθυνσιοδότησης (Άμεση διευθυνσιοδότηση) (Διευθυνσιοδότηση μέσω καταχωρητή) (Διευθυνσιοδότηση βάσης) (Σχετική διευθυνσιοδότηση ως προς PC) (Ψευδο-απευθείας διευθυνσιοδότηση) Chapter 2 Instructions: Language of the Computer 6
Μετάφραση και Εκκίνηση Πολλοί μεταγλωττιστές παράγουν τις υπομονάδες σε γλώσσα μηχανής (object modules) απευθείας Στατική σύνδεση Chapter 2 Instructions: Language of the Computer 7
Ψευδοεντολές συμβολομεταφραστή Οι περισσότερες εντολές της συμβολικής γλώσσας παριστούν εντολές κώδικα μηχανής σε μια αντιστοιχία μία-προς-μία Ψευδοεντολές: αποκυήματα της φαντασίας του συμβολομεταφραστή (assembler) move $t0, $t1 add $t0, $zero, $t1 blt $t2, $t3, L5 slt $at, $t2, $t3 bne $at, $zero, L5 $at (register 1): assembler temporary (είναι δεσμευμένος για τον συμβολομεταφραστή) Chapter 2 Instructions: Language of the Computer 8
Παράγοντας μια υπομονάδα σε γλώσσα μηχανής (object module ή object file) Ο συμβολομεταφραστής (ή ο μεταγλωττιστής) μεταφράζει το πηγαίο πρόγραμμα σε εντολές μηχανής (κώδικα μηχανής στο δυαδικό) Παρέχει πληροφορίες για την δημιουργία ενός ολόκληρου προγράμματος από τα διάφορα μέρη Επικεφαλίδα (header): περιγράφει μέγεθος και θέση των υπόλοιπων τμημάτων του αντικειμενικού αρχείου Τμήμα κειμένου (text segment): μεταφρασμένες εντολές Τμήμα στατικών δεδομένων (static data segment): δεδομένα κατανεμημένα για όλη την διάρκεια ζωής του προγράμματος Πληροφορίες επανατοποθέτησης (relocation info): για περιεχόμενα (εντολές ή δεδομένα) που εξαρτώνται από απόλυτες διευθύνσεις του φορτωμένου προγράμματος Πίνακας συμβόλων (symbol table): υπόλοιπες ετικέτες (global definitions) και εξωτερικές αναφορές Πληροφορίες αποσφαλμάτωσης (debugging info): για την συσχέτιση με τον πηγαίο κώδικα Chapter 2 Instructions: Language of the Computer 9
Συνδέοντας αντικειμενικές υπομονάδες (object modules) Παράγει μια εκτελέσιμη εικόνα (executable image) 1. Συνενώνει τμήματα (merges segments) - τοποθετεί υπομονάδες κώδικα και δεδομένων στην μνήμη 2. Επιλύει ετικέτες δεδομένων και εντολών (καθορισμός των διευθύνσεών τους) 3. Επιδιορθώνει (patch) εσωτερικές και εξωτερικές αναφορές (references) Θα μπορούσε να αφήσει τις εξαρτώμενες από την θέση αναφορές να ταχτοποιηθούν από τον φορτωτή (relocating loader) Αλλά με την εικονική μνήμη, αυτό δεν είναι αναγκαίο Το πρόγραμμα μπορεί να φορτωθεί σε απόλυτη θέση (absolute location) στον χώρο της εικονικής μνήμης (virtual memory space) Chapter 2 Instructions: Language of the Computer 10
Φορτώνοντας ένα πρόγραμμα Το λειτουργικό σύστημα (Λ.Σ.) φορτώνει το εκτελέσιμο αρχείο από τον δίσκο στην μνήμη 1. Διαβάζει την επικεφαλίδα για τον προσδιορισμό του μεγέθους των τμημάτων κειμένου και δεδομένων 2. Δημιουργεί χώρο διευθύνσεων για κείμενο & δεδομένα 2. Αντιγράφει τις εντολές & τα αρχικά δεδομένα στην μνήμη 3. Αντιγράφει τις παραμέτρους (αν υπάρχουν) στην στοίβα 4. Αρχικοποιεί τους καταχωρητές (συμπ. $sp, $fp, $gp) 5. Μεταπηδά σε μια ρουτίνα εκκίνησης, που, αντιγράφει τις παραμέτρους στα $a0, και καλεί την main και όταν η main επιστρέφει, η ρουτίνα εκκίνησης τερματίζει το πρόγραμμα Chapter 2 Instructions: Language of the Computer 11
Δυναμική σύνδεση Συνδέει/φορτώνει διαδικασία βιβλιοθήκης μόνο όταν καλείται Απαιτεί ο κώδικας της διαδικασίας να είναι επανατοποθετούμενος (relocatable) Αποτρέπει το φούσκωμα της εικόνας (του αρχείου) που προκαλείται από την στατική σύνδεση όλων των (μεταβατικά) αναφερόμενων βιβλιοθηκών Αυτόματα τραβάει (picks up) τις νέες εκδόσεις των βιβλιοθηκών Chapter 2 Instructions: Language of the Computer 12
Σύντομο παράδειγμα στην C Επεξηγεί την χρήση εντολών συμβολικής γλώσσας για μια συνάρτηση ταξινόμησης (bubble sort) σε C Διαδικασία-φύλλο Swap (leaf) void swap(int v[], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; return; } Το v στον $a0, το k στον $a1 και το temp στο $t0 Chapter 2 Instructions: Language of the Computer 13
Η διαδικασία Swap swap: sll $t1, $a1, 2 # $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v+(k*4) # {address of v[k]} lw $t0, 0($t1) # $t0 (temp) = v[k] lw $t2, 4($t1) # $t2 = v[k+1] sw $t2, 0($t1) # v[k] = $t2 (v[k+1]) sw $t0, 4($t1) # v[k+1] = $t0 (temp) jr $ra # return to calling routine Chapter 2 Instructions: Language of the Computer 14
Η διαδικασία ταξινόμησης στην C Ένθετη διαδικασία (non-leaf) (καλεί την swap) void sort (int v[], int n) { int i, j; for (i = 0; i < n; i++) for (j=i 1; j >= 0 && v[j]>v[j+1];j--) swap(v,j); } Το v στον $a0, το n στον $a1, το i στον $s0 και το j στον $s1 Chapter 2 Instructions: Language of the Computer 15
Το σώμα της διαδικασίας move $s2, $a0 # save $a0 into $s2 move $s3, $a1 # save $a1 into $s3 move $s0, $zero # i = 0 for1tst: slt $t0, $s0, $s3 # $t0 = 0 if $s0 $s3 (i n) beq $t0, $zero, exit1 # go to exit1 if $s0 $s3 (i n) addi $s1, $s0, 1 # j = i 1 for2tst: slti $t0, $s1, 0 # $t0 = 1 if $s1 < 0 (j < 0) bne $t0, $zero, exit2 # go to exit2 if $s1 < 0 (j < 0) sll $t1, $s1, 2 # $t1 = j * 4 add $t2, $s2, $t1 # $t2 = v + (j * 4) lw $t3, 0($t2) # $t3 = v[j] lw $t4, 4($t2) # $t4 = v[j + 1] slt $t0, $t4, $t3 # $t0 = 0 if $t4 $t3 beq $t0, $zero, exit2 # go to exit2 if $t4 $t3 move $a0, $s2 # 1st param of swap is v (old $a0) move $a1, $s1 # 2nd param of swap is j jal swap # call swap procedure addi $s1, $s1, 1 # j = 1 j for2tst # jump to test of inner loop exit2: addi $s0, $s0, 1 # i += 1 j for1tst # jump to test of outer loop Move params Outer loop Inner loop Pass params & call Inner loop Outer loop Chapter 2 Instructions: Language of the Computer 16
Όλη η διαδικασία sort: addi $sp, $sp, 20 # make room on stack for 5 registers sw $ra, 16($sp) # save $ra on stack sw $s3, 12($sp) # save $s3 on stack sw $s2, 8($sp) # save $s2 on stack sw $s1, 4($sp) # save $s1 on stack sw $s0, 0($sp) # save $s0 on stack # procedure body exit1: lw $s0, 0($sp) # restore $s0 from stack lw $s1, 4($sp) # restore $s1 from stack lw $s2, 8($sp) # restore $s2 from stack lw $s3, 12($sp) # restore $s3 from stack lw $ra, 16($sp) # restore $ra from stack addi $sp, $sp, 20 # restore stack pointer jr $ra # return to calling routine Chapter 2 Instructions: Language of the Computer 17
Πλάνες (Fallacies) Ισχυρές εντολές Υψηλότερες επιδόσεις Απαιτούνται λιγότερες εντολές Αλλά πολύπλοκες εντολές υλοποιούνται δυσκολότερα Μπορεί να προκαλέσουν αργοπορία σε όλες τις εντολές, ακόμα και στις απλές Οι μεταγλωττιστές είναι καλοί στο να φτιάχνουν γρήγορο κώδικα από απλές εντολές Χρησιμοποίησε συμβολική γλώσσα για υψηλή επίδοση Αλλά οι μοντέρνοι μεταγλωττιστές είναι καλύτεροι όταν συνεργάζονται με μοντέρνους επεξεργαστές Περισσότερες γραμμές κώδικα περισσότερα λάθη και μικρότερη παραγωγικότητα Chapter 2 Instructions: Language of the Computer 18
Πλάνες (Fallacies) Συμβατότητα προς τα πίσω το σετ των εντολών δεν αλλάζει Αλλά προστίθενται περισσότερες εντολές Πλήθος συνόλου εντολών x86 instruction set Chapter 2 Instructions: Language of the Computer 19
Παγίδες (Pitfalls) Διαδοχικές λέξεις δεν βρίσκονται σε διαδοχικές διευθύνσεις Αυξάνουμε κατά 4, και όχι κατά 1! Η διατήρηση ενός δείκτη διεύθυνσης (pointer) που δείχνει μια αυτόματη (τοπική) μεταβλητή μετά την επιστροφή της διαδικασίας π.χ., επιστροφή ενός δείκτη διεύθυνσης διά μέσου ενός ορίσματος Ο δείκτης διεύθυνσης καθίσταται άκυρος όταν δείχνει στοιχεία που έχουν αποσυρθεί από την στοίβα Chapter 2 Instructions: Language of the Computer 20
Συμπερασματικά σχόλια Αρχές σχεδίασης 1. Η απλότητα ευνοεί την κανονικότητα 2. Το μικρότερο είναι γρηγορότερο 3. Κάνε την συχνή περίπτωση γρήγορη 4. Καλή σχεδίαση απαιτεί καλούς συμβιβασμούς Επίπεδα λογισμικού/υλικού Μεταγλωττιστής, συμβολομεταφραστής, υλικό MIPS: τυπική σχεδίαση RISC αρχιτεκτονικής (RISC ISAs = Reduced Instruction Set Computer Instruction Set Architectures) Chapter 2 Instructions: Language of the Computer 21