Κεφάλαιο 2 Εντολές Η γλώσσα της Μηχανής (Instructions Language of the Computer) 1
Ανακοινώσεις Ιστοσελίδα μαθήματος ΗΜΥ 212, ενημερώνεται συχνά: http://www.ece.ucy.ac.cy/courses/ece212/ Ιστοσελίδα εργαστηρίου ΗΜΥ 213: http://www.ece.ucy.ac.cy/courses/ece213/ Αλλαγές στο συμβόλαιο μαθήματος (δείτε ιστοσελίδα) ΗΜΥ 213: Ακυρώνεται η πρώτη συνάντηση τη Δευτέρα 29/01 και μεταφέρεται την Πέμπτη 01/02 στις 8:00 π.μ. Λατσιά ΛΑ130, η παρουσίαόλωνείναι υποχρεωτική Πρόγραμμα εξετάσεων (δείτε ιστοσελίδα) Πρόγραμμα κατ οίκον ασκήσεων (δείτε ιστοσελίδα) Αλλαγή στις ώρες γραφείου (δείτε ιστοσελίδα) 2
Τι θα μάθουμε σε αυτό το Κεφάλαιο: Εντολές (Instructions): οι λέξεις της γλώσσας του υπολογιστή Ανθρώπινη μορφή: Συμβολική γλώσσα (Assembly language) Μορφή υπολογιστή: Γλώσσα μηχανής (Machine language), σε δυαδικό Σύνολο απλών εντολών (simple instruction set) Σχέση με γλώσσα προγραμματισμού ψηλού επιπέδου (γλώσσα C) Υλοποίηση υλικού Αρχιτεκτονική MIPS Δημοφιλής αρχιτεκτονική Θα μελετήσουμε το MIPS ISA, βήμα-προς-βήμα Έννοια αποθηκεμένου προγράμματος Εντολές και δεδομένα διαφορετικών τύπων αποθηκεύονται στη μνήμη σε δυαδική μορφή 3
Αρχιτεκτονική MIPS Αναπτύχθηκε στο Πανεπιστήμιο του Stanford από τον Καθ. John Hennessy και μια ομάδα μεταπτυχιακών φοιτητών Παρόμοια με τις άλλες αρχιτεκτονικές μικροεπεξεργαστών που αναπτύχθηκαν από τη δεκαετία του 1980 Το 1984 δημιουργήθηκε η MIPS Computer Systems Corp., για την κατασκευή υπολογιστών Unix υψηλής απόδοσης με MIPS μικροεπεξεργαστές 1400 1300 1200 1100 1000 900 800 700 600 500 400 300 200 100 0 Other SPARC Hitachi SH PowerPC Motorola 68K MIPS IA-32 ARM 1998 1999 2000 2001 2002 Πωλήσεις μικροεπεξεργαστών ανά ISA Σχεδόν 100 εκατομμύρια επεξεργαστών MIPS κατασκευάστηκαν το 2002 Χρησιμοποιούνται από τις εταιρίες DEC, NEC, Nintendo, Cisco, Silicon Graphics, Sony, Siemens, LSI Logic, 4
Αριθμητική MIPS Όλες οι εντολές έχουν 3 τελεστές (operands) και μπορούν να εκτελέσουν μία μόνο πράξη κάθε φορά Η διάταξη των τελεστών είναι σταθερή (πρώτα ο τελεστής του αποτελέσματος) Παράδειγμα: Κώδικας C: a = b + c; Κώδικας MIPS: add $a, $b, $c (Assembly) a, b, c είναι καταχωρητές (θα δούμε περισσότερα σε λίγο) The natural number of operands for an operation like addition is three requiring every instruction to have exactly three operands, no more and no less, conforms to the philosophy of keeping the hardware simple 5
Αριθμητική MIPS (συν.) Ηπρόσθεση2 ή περισσότερων αριθμών εκτελείται από μία σειρά εντολών πρόσθεσης 2 αριθμών Παράδειγμα: Κώδικας C: a = b + c + d + e; Κώδικας MIPS: add $a, $b, $c # a=b+c add $a, $a, $d # a=b+c+d add $a, $a, $e # a=b+c+d+e # -- το σύμβολο για τα σχόλια, ισχύει μέχρι το τέλος της γραμμής Σε αντίθεση με άλλες γλώσσες προγραμματισμού, η assembly επιτρέπει μόνο 1 εντολή ανά γραμμή 6
Αριθμητική MIPS (συν.) 1 η Αρχή Σχεδιασμού: «Η απλότητα ευνοεί την κανονικότητα» (simplicity favors regularity) Αυτό μπορεί και να περιπλέξει ορισμένα θέματα... Απαιτεί μεγαλύτερο αριθμό εντολών (π.χ. n εντολές για την πρόσθεση n+1 αριθμών) Οι τελεστές πρέπει να είναι καταχωρητές, όχι διευθύνσεις μνήμης (σε αντίθεση με τους μικροεπεξεργαστές της Ιntel που επιτρέπουν σε αριθμητικές εντολές να έχουν κάποιους τελεστές στη μνήμη) Η MIPS παρέχει μόνο 32 καταχωρητές Ο κάθε καταχωρητής έχει 32 bits Τα πιο πάνω ισχύουν για τη MIPS-32. Υπάρχει και η MIPS-64, με 32 καταχωρητές των 64 ων bit. 7
Αριθμητική MIPS (συν.) Πιο είναι το αποτέλεσμα του μεταγλωττιστή για τα 2 πιο κάτω C προγράμματα; Εντολές C Μεταγλωττιστής C Εντολές MIPS a = b + c; d = a e; f = (g + h) (j + j); 8
Αριθμητική MIPS (συν.) Πιο είναι το αποτέλεσμα του μεταγλωττιστή για τα 2 πιο κάτω C προγράμματα; Εντολές C Μεταγλωττιστής C Εντολές MIPS a = b + c; add $a, $b, $c d = a e; sub $d, $a, $e f = (g + h) (i + j); add $t0,$g,$h add $t1,$i,$j sub $f,$t0,$t1 9
Καταχωρητές (Registers) Οι τελεστές αριθμητικών εντολών πρέπει να είναι καταχωρητές, παρέχονται μόνο 32 καταχωρητές των 32-bit (= 1 λέξη) 2 η Αρχή Σχεδιασμού: «Τομικρότεροείναικαιτογρηγορότερο»(Smaller is faster) Γιατί; Σύμβαση MIPS για ονόματα καταχωρητών: $s0, $s1, $s2, για καταχωρητές που αντιστοιχούν σε μεταβλητές στο πρόγραμμα υψηλού επιπέδου $t0, $t1, $t2, για προσωρινές μεταβλητές απαραίτητες για το μεταγλωττισμό σε κώδικα MIPS Παράδειγμα: f = (g + h) (i + j); add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 # καταχωρητής $t0 = g+h # καταχωρητής $t1 = i+j # καταχωρητής $s0 = f 10
Καταχωρητές vs. Μνήμη Ο μεταγλωττιστής συσχετίζει μεταβλητές (variables) με καταχωρητές (registers) Τι συμβαίνει με προγράμματα που έχουν μεγάλο αριθμό μεταβλητών; Βασική δομή ενός υπολογιστή Control Input Memory Datapath Output Processor I/O Η μνήμη (memory) χρησιμοποιείται για αποθήκευση των εντολών, δεδομένων και αποτελεσμάτων ενός προγράμματος Τα δεδομένα μεταφέρονται από την μνήμη στους καταχωρητές Χρειαζόμαστε εντολές για μεταφορά δεδομένων (data transfer instructions) για φόρτωση από και αποθήκευση στη μνήμη, όπως lw ( = load word) και sw ( = store word) 11
Οργάνωση Μνήμης Εντολή Φόρτωσης (lw) Η μνήμη θεωρείται ως ένας μεγάλος, μονοδιάστατος πίνακας λέξεων/bytes/bits με συγκεκριμένη αρχική διεύθυνση (base address) Γιαναέχειπρόσβασηστημνήμημιαεντολήπρέπειναμπορείναπαρέχειτη «διεύθυνση» των ζητούμενων δεδομένων Μια διεύθυνση μνήμης (memory address) καθορίζεται με ένα δείκτη στον πίνακα (0, 1, 2, ) «Διευθυνσιοδότηση με Byte» (Byte addressing) υπονοεί ότι ο δείκτης δείχνει σε ένα byte (= 8 συνεχόμενα bits) του πίνακα Διεύθυνση byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 Μνήμη 8 bits of data 8 bits of data 8 bits of data 8 bits of data 8 bits of data 8 bits of data 8 bits of data Θεωρήστε ένα πίνακα A με 100 λέξεις (όπου 1 λέξη = 1 byte), με g $s1, h $s2, και ο καταχωρητής αρχικής διεύθυνσης (base register) $s3 g = h + A[5]; lw $t0, 5($s3) #lw = load word add $s1, $s2, $t0 base register: έχει την αρχική διεύθυνση του πίνακα, δηλ. τη διεύθυνση του 1 ου στοιχείου (λέξης) του πίνακα offset: ο δείκτης στον πίνακα, σταθερός στην εντολή διεύθυνση = base register + offset 12
Οργάνωση Μνήμης για ΜΙPS Συνήθως μια «λέξη» (word) είναι μεγαλύτερη από 1 byte Στη MIPS, οι καταχωρητές μπορούν να κρατήσουν μέχρι και 32 bits, άρα, μια λέξη έχει 32 bits ή 4 bytes Διεύθυνση byte 0 byte 4 byte 8 byte 12... Μνήμη 32 bits of data 32 bits of data 32 bits of data 32 bits of data Byte address της 0 ης λέξης = 0 (= 0 x 4) Byte address της 1 ης λέξης = 4 (= 1 x 4) Byte address της 2 ης λέξης = 8 (= 2 x 4) Byte address της n ης λέξης = n x 4 Έχουμε 2 32 bytes σε byte addresses: 0, 1, 2,, 2 32-1 Έχουμε 2 30 λέξεις σε byte addresses: 0, 4, 8,..., 2 32-4 (Big Endian) Για το παράδειγμα της προηγούμενης διαφάνειας (g = h + A[5];): lw $t0, 20($s3) # byte address του offset είναι 5x4=20 add $s1, $s2, $t0 13
Εντολές Φόρτωσης και Αποθήκευσης - Παράδειγμα Κώδικας C: A[12] = h + A[8]; Κώδικας MIPS: lw $t0, 32($s3) # 32 = 8x4 add $t0, $s2, $t0 sw $t0, 48($s3) # store word Ο μεταγλωττιστής συσχετίζει: base register σε $s3 (έχει τη διεύθυνση της 1 ης λέξης του πίνακα A) μεταβλητή h στον καταχωρητή $s2 Η εντολή sw έχει τον τελεστή αποτελέσματος τελευταίο Θυμηθείτε ότι για αριθμητικές εντολές, όλοι οι τελεστές πρέπει να είναι καταχωρητές, όχι διευθύνσεις μνήμης! add 48($s3), $s2, 32($s3) -- Άκυρο 14
Αριθμητικές Εντολές με Σταθερούς -- Άμεσες Εντολές Θεωρήστε ότι ο αριθμός 4 είναι ένας σταθερός στη γλώσσα C και έχει αποθηκευτεί στην διεύθυνση της μνήμης AddrConstant4. Η αρχική διεύθυνση στη μνήμη που έχει τα δεδομένα του προγράμματος βρίσκεται στον καταχωρητή $s1. Για να προσθέσουμε το 4 στον $s3: lw $t0, AddrConstant4($s1) # $t0 = constant 4 add $s3, $s3, $t0 # $s3 = $s3 + $t0 ή addi $s3, $s3, 4 # $s3 = $s3 + 4 Ηεντολήaddi ονομάζεται «άμεση εντολή» (immediate instruction). Επιτρέπει ένας τελεστής να είναι σταθερός. 3 η Αρχή Σχεδιασμού: «Η συνήθης πράξη πρέπει να είναι γρήγορη» (Make the common case fast) 15
Άμεσες Εντολές MIPS (συν.) Δεν υπάρχει εντολή subi Λιγότερο κοινή στη C, Java Η εντολή addi μπορεί να χρησιμοποιηθεί αφού ο σταθερός μπορεί να είναι και αρνητικός αριθμός 16
Μέχρι στιγμής έχουμε μάθει: MIPS ηφόρτωση/αποθήκευση γίνεται με λέξεις (1 λέξη μεταφέρεται από/προς τη μνήμη) η διευθυνσιοδότηση γίνεται με bytes (byte addressing) αριθμητική μόνο με καταχωρητές Εντολή MIPS Πράξη που εκτελείται add $s1, $s2, $s3 $s1 = $s2 + $s3 addi $s1, $s2, 100 $s1 = $s2 + 100 sub $s1, $s2, $s3 $s1 = $s2 $s3 lw $s1, 100($s2) $s1 = Memory[$s2+100] sw $s1, 100($s2) Memory[$s2+100] = $s1 17
Γλώσσα Μηχανής Διάταξη Εντολών Οι εντολές κρατούνται στον υπολογιστή ως μια σειρά από ηλεκτρικά σήματα ψηλής ή χαμηλής τάσης δυαδικά ψηφία Οι εντολές, όπως και οι καταχωρητές και οι λέξεις δεδομένων, αποτελούνται από 32 bits Ο κάθε καταχωρητής έχει ένα αριθμό, από 1 σε 32. Π.χ. $t1=9, $s1=17, $s2=18 (θα δούμε ολοκληρωμένη λίστα σύντομα) Μορφή Εντολής (Instruction Format): καθορίζεται από τη διάταξη της εντολής Παράδειγμα: Θεωρήστε την αριθμητική εντολή add $t1, $s1, $s2 op rs rt rd shamt funct 0 17 18 9 0 32 000000 10001 10010 01001 00000 100000 Διάταξη Αριθμητικής Εντολής Γλώσσα Μηχανής (Δεκαδικό) Γλώσσα Μηχανής (Δυαδικό) Μπορείτε να μαντέψετε τι σημαίνει το όνομα του κάθε πεδίου (field); 18
Διάταξη Εντολών Μηχανής (συν.) Κάθε πεδίο έχει αμετάβλητο μέγεθος και παρέχει στον υπολογιστή συγκεκριμένη πληροφορία: op (6 bits): opcode -- βασική πράξη της εντολής rs (5 bits): καταχωρητής για 1 ο τελεστή rt (5 bits): καταχωρητή για 2 ο τελεστή rd (5 bits): καταχωρητής αποτελέσματος shamt (5 bits): ποσόν ολίσθησης funct (6 bits): function code -- συγκεκριμένη αριθμητική λειτουργία Γιατί αναθέτουμε 5-bits για την αναπαράσταση των καταχωρητών; Ποιος είναι ο μεγαλύτερος αριθμός πράξεων που μπορούν να εκτελεστούν; 19
Διάταξη Εντολών Μηχανής (συν.) Για λόγους απλότητας και καλύτερης/ευκολότερης αναγνωσιμότητας, οι εντολές της μηχανής γράφονται στο δεκαεξαδικό (Hex) σύστημα, αντί στο δυαδικό. Ηεντολή (000000 10001 10010 01001 00000 100000) 2 γίνεται (02324820) 16 20
Είδη Διατάξεων Εντολών (συν.) Τι συμβαίνει αν μια εντολή απαιτεί μεγαλύτερα πεδία; Θεωρήστε τις εντολές load-word (lw) και store-word (sw), όπου πρέπει να καθοριστούν 2 καταχωρητές και 1 σταθερός Τι πρέπει να γίνει, βάση της Αρχής της Κανονικότητας; Καινούρια Αρχή: «Ο καλός σχεδιασμό απαιτεί συμβιβασμό» Εισάγουμε ένα νέο τύπο διάταξης εντολής I-type για άμεσες εντολές και εντολές μεταφοράς δεδομένων Ο προηγούμενος τύπος ονομάζεται R-type για εντολές με 3 καταχωρητές Παράδειγμα: lw $t0, 32($s2) 35 18 9 32 6 bits 5 bits 5 bits 16 bits op rs rt 16 bit number Ποιος είναι ο συμβιβασμός; Πως θα ξεχωρίζουμε μεταξύ των 2 τύπων; 21
Κωδικοποίηση (Encoding) Εντολών MIPS Εντολή Τύπος op rs rt rd shamt funct Διεύθυνση add R 0 Reg Reg Reg 0 32 - sub R 0 Reg Reg Reg 0 34 - addi I 8 Reg Reg - - - address lw I 35 Reg Reg - - - address sw I 43 Reg Reg - - - address Μέγεθος πεδίων (σε # bits): Πεδίο op rs rt rd shamt funct Διεύθυνση Μέγεθος 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits 16 bits Οι εντολές add και sub έχουν το ίδιο πεδίο op Το πεδίο funct καθορίζει την αριθμητική εντολή (sub, add) που θα εκτελεστεί 22
Η έννοια του Αποθηκεμένου Προγράμματος Μια εντολή είναι ουσιαστικά μια στοιχειοσειρά δυαδικών ψηφίων (string of bits) Τα προγράμματα (εντολές) φυλάγονται στην μνήμη για γρήγορη ανάγνωση και γραφή, όπως γίνεται για τα δεδομένα Μνήμη Μικροεπεξεργαστής (Processor) Πρόγραμμα Επεξεργασίας Κειμένου (σε γλώσσα μηχανής) Μεταγλωττιστής C (σε γλώσσα μηχανής) Κείμενο Βιβλίου Πηγαίος Κώδικας C για Πρόγραμμα Επεξ. Κειμένου Κύκλος Προσκόμισης και Εκτέλεσης (Fetch & Execute Cycle) Η κάθε εντολή προσκομίζεται και τοποθετείται σε ειδικό καταχωρητή Κάποια bits του καταχωρητή «ελέγχουν» την ακόλουθη δραστηριότητα Προσκομίζεται η «επόμενη» εντολή Ο μετρητής προγράμματος (program counter) είναι ειδικός καταχωρητής που διατηρεί την διεύθυνση της επόμενης εντολής προς εκτέλεση 23
Εντολές Λογικής (Logic Instructions) Λογικές Πράξεις Τελεστής C ΤελεστήςJava Εντολή MIPS Ολίσθηση αριστερά << << sll Ολίσθηση δεξιά >> >>> srl Bit-by-bit AND & & and, andi Bit-by-bit OR or, ori Bit-by-bit NOT ~ ~ nor Το not υλοποιείται με nor και ένα τελεστή ίσο με μηδέν Για λειτουργίες ολίσθησης (sll, srl), πλήρωση με μηδέν and/or/not είναι πράξεις 3 ων -τελεστών/καταχωρητών, π.χ. and $t0, $t1, $t2 # $t0 = $t1 & $t2 nor $t0, $t1, $t2 # $t0 = ~( $t1 $t2 ) Ποιος τύπος διάταξης εντολής μπορεί να χρησιμοποιηθεί για αυτές τις εντολές λογικής (I-type of R-type); 24
Εντολές Λογικής (συν.) Υπάρχουν επίσης και οι εντολές andi και ori για άμεσες εντολές λογικής με σταθερό andi $s1, $s2, 100 # $s1 = $s2 & 100 ori $s1, $s2, 100 # $s1 = $s2 100 Ποιος τύπος διάταξης εντολής μπορεί να χρησιμοποιηθεί για αυτές τις εντολές λογικής (I-type of R-type); Εντολές Ολίσθησης (Shift): sll $t2, $s0, 4 # $t2 = $s0 << 4 Το περιεχόμενο του $s0 μετακινείται 4 bits αριστερά, τα 4 bits στα δεξιά παίρνουν την τιμή 0 και το αποτέλεσμα αποθηκεύεται στον $t2 Το 4 ονομάζεται το «ποσό ολίσθησης» (shift amount) και δηλώνεται στο πεδίο shamt της διάταξης εντολής R-type Ολίσθηση αριστερά κατά i bits δίνει πολλαπλασιασμό επί 2 i 25
Εντολές Ελέγχου (Control Instructions) Εντολές Λήψεως Αποφάσεων ή Εντολές Ελέγχου Αλλάζουν την ροή εκτέλεσης των εντολών Απαραίτητες αφού η σειρά εκτέλεσης των εντολών μπορεί να εξαρτάται από τις τιμές δεδομένων που πιθανόν να αλλάζουν κατά τη διάρκεια ενός προγράμματος Δηλ., καθορίζουν την «επόμενη» εντολή προς εκτέλεση Εντολές MIPS με διακλάδωση υπό συνθήκη (conditional branch): bne $t0, $t1, L1 # Εάν $t0 $t1 η επόμενη εντολή # βρίσκεται στη διεύθυνση L1 beq $t0, $t1, L1 # Εάν $t0 = $t1 η επόμενη εντολή # βρίσκεται στη διεύθυνση L1 Παράδειγμα: if (i==j) h = i + j; (i $s0, j $s1, h $s3)... bne $s0, $s1, L1 add $s3, $s0, $s1 L1:... 26
Εντολές Ελέγχου (συν.) Εντολές MIPS με διακλάδωση χωρίς συνθήκη (unconditional branch): j label Ονομάζεται και εντολή άλματος (jump instruction) Παράδειγμα: if (i!=j) beq $s4, $s5, Else h=i+j; add $s3, $s4, $s5 else j Exit h=i-j; Else: sub $s3, $s4, $s5 Exit:... Μπορείτε να υλοποιήσετε ένα απλό βρόγχο (for loop); 27
Εντολές Ελέγχου (συν.) Γλώσσα C While (save[i] == k) i += 1; i $s3 k $s5 Βάση/αρχική διεύθυνση του save[ ] στο $s6 save[ ] 0 1 2 3... n k k k j x Assembly (ΜΙPS) 28
Μέχρι στιγμής έχουμε εξετάσει: Εντολή Πράξη που εκτελείται add $s1,$s2,$s3 $s1 = $s2 + $s3 sub $s1,$s2,$s3 $s1 = $s2 $s3 lw $s1,100($s2) $s1 = Memory[$s2+100] sw $s1,100($s2) Memory[$s2+100] = $s1 bne $s4,$s5,l Επόμενη εντολή στο L εάν $s4 $s5 beq $s4,$s5,l Επόμενη εντολή στο L εάν $s4 = $s5 j Label Επόμενη εντολή στο Label Εντολές Λογικής (and, or, nor, sll, srl) Άμεσες Εντολές (addi, andi, ori) Διατάξεις Εντολών: R I J op rs rt rd shamt funct op rs rt 16 bit address op 26 bit address 29
Ροή Ελέγχου Μέχρι στιγμής έχουμε τις εντολές ελέγχου beq και bne Υπάρχει και η λειτουργία branch-if-less-than (blt), συχνά χρήσιμη! Νέα εντολή (ανάθεση σε 0/1 εάν μικρότερο από): slt $t0, $s1, $s2 #$t0=1 εάν $s1<$s2, αλλιώς $t0=0 slti $t0, $s2, 10 #$t0=1 εάν $s2<10, αλλιώς $t0=0 Η MIPS δεν περιλαμβάνει την εντολή blt (branch-if-else) Αυτό γίνεται για λόγους απλότητας, για να διατηρηθεί ο κύκλος του ρολογιού μικρότερος Εναλλακτικά, στη MIPS χρησιμοποιούνται οι εντολές beq, bne, slt, slti και ο καταχωρητής $zero (πάντα περιέχει την τιμή 0) για την υλοποίηση της πράξης blt. Πως μπορεί να γίνει αυτή η υλοποίηση? 30
Μέχρι στιγμής έχουμε μάθει για τη ΜΙPS: Τελεστές (operands) MIPS Κατηγορία Τελεστών Παράδειγμα Σχόλια 32 καταχωρητές $s0, $s1, $s7 $t0, $t1, $t7 $zero -- Γρήγορος εντοπισμός δεδομένων. Τα δεδομένα πρέπει να βρίσκονται σε καταχωρητή για εκτέλεση αριθμητικής εντολής. -- Ο καταχωρητής $zero έχει πάντα την τιμή 0. -- Οι καταχωρητές $s0--$s7 αντιστοιχούν σε 16-23 και οι καταχωρητές $t0--$t7 σε 8-15. 2 30 32-μπιτες λέξεις στη μνήμη Memory[0], Memory[4], Memory[4292967292] -- Πρόσβαση μόνο από εντολές μεταφοράς δεδομένων. -- Η διεύθυνση δίνεται σε bytes, δηλ. δύο συνεχόμενες λέξεις διαφέρουν κατά 4. -- Στη μνήμη αποθηκεύονται δομές δεδομένων όπως πίνακες, στοίβες, περιεχόμενα καταχωρητών. 31
Μέχρι στιγμής έχουμε μάθει για τη ΜΙPS (συν.): Γλώσσα MIPS Assembly (Εντολές) Κατηγορία Αριθμητικές Μεταφοράς Δεδομένων Εντολές Παράδειγμα Πράξη Σχόλια Πρόσθεση add $s1, $s2, $s3 $s1 = $s2 + $s3 3 τελεστές, δεδομένα σε καταχωρητές Αφαίρεση sub $s1, $s2, $s3 $s1 = $s2 - $s3 3 τελεστές, δεδομένα σε καταχωρητές Άμεση addi $s1, $s2, 100 $s1 = $s2 + 100 Πρόσθεση με σταθερό Πρόσθεση Φόρτωση lw $s1, 100($s2) $s1 = Memory[$s2+100] Δεδομένα από μνήμη σε Λέξης καταχωρητή Αποθήκευση Λέξης And and $s1, $s2, $s3 $s1 = $s2 & $s3 AND sw $s1, 100($s2) Memory[$s2+100] = $s1 Δεδομένα από καταχωρητή σε μνήμη Or or $s1, $s2, $s3 $s1 = $s2 $s3 OR Nor nor $s1, $s2, $s3 $s1 =~( $s2 $s3) NOR Λογικής Άμεσο And andi $s1, $s2, 100 $s1 = $s2 & 100 AND με σταθερό Άμεσο Or ori $s1, $s2, 100 $s1 = $s2 100 OR με σταθερό Ολίσθηση Αριστερά Ολίσθηση Δεξιά sll $s1, $s2, 10 $s1 = $s2 << 10 Ολίσθηση αριστερά από σταθερό slr $s1, $s2, 10 $s1 = $s2 >> 10 Ολίσθηση δεξιά από σταθερό 32
Μέχρι στιγμής έχουμε μάθει για τη ΜΙPS (συν.): Γλώσσα MIPS Assembly(Εντολές) συν. Κατηγορία Εντολές Παράδειγμα Πράξη Σχόλια Διακλάδωση υπό συνθήκη Διακλάδωση αν ισούνται Διακλάδωση αν δεν ισούνται Ανάθεση βάση τιμής beq $s1, $s2, L if ($s1 == $s2) go to L Έλεγχος ισότητας. Διεύθυνση σχετική με PC. bne $s1, $2, L if ($s1!= $s2) go to L Έλεγχος ανισότητας. Διεύθυνση σχετική με PC. slt $s1, $s2, $s3 if ($s2<$s3) $s1 = 1; else $s1 = 0 Σύγκριση για μικρότερο: για beq, bne Άμεση ανάθση βάση τιμής slti $s1, $s2, 100 if ($s2<100) $s1 = 1; else $s1 = 0 Σύγκριση για μικρότερο, με σταθερό: για beq, bne Διακλάδωση χωρίς συνθήκη Άλμα j L go to L Άλμα στη διεύθυνση. 33
Μέχρι στιγμής έχουμε μάθει για τη ΜΙPS (συν.): Γλώσσα Μηχανής MIPS (σε δεκαδικό) Όνομα Τύπος Παράδειγμα Σχόλια Διάταξης Add R 0 2 3 1 0 32 add $s1, $s2, $s3 Sub R 0 2 3 1 0 34 sub $s1, $s2, $s3 Addi I 8 2 1 100 addi $s1, $s2, 100 Lw I 35 2 1 100 lw $s1, 100($s2) Sw I 43 2 1 100 sw $s1, 100($s2) Beq I 4 1 2 100 beq $s1, $s2, 100 Bne I 5 1 2 100 bne $s1, $s2, 100 Slt R 0 2 3 1 0 42 slt $s1, $s2, $s3 Slti I 10 2 1 100 slti $s1, $s2, 100 J J 2 10000 j 10000 Μέγεθος Πεδίου 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits Όλες οι εντολές MIPS έχουν 32 bits Διάταξη R R op rs rt rd Shamt funct Διάταξη I I op rs rt Διεύθυνση / Σταθερός Διάταξη για εντολές μεταφοράς, διακλάδωσης, και άμεσες εντολές Διάταξη J J op Διεύθυνση Διάταξη για εντολή άλματος Διάταξη για αριθμητικές εντολές 34
Υποστήριξη Συναρτήσεων από Υλικό Συνάρτηση (Procedure ή Function ή Routine): Αποθηκεμένη μονάδα προγράμματος που υλοποιεί συγκεκριμένη εργασία βάση των παραμέτρων με τους οποίους καλείται Πλεονεκτήματα χρήσης συναρτήσεων: Καλύτερη δομή προγράμματος Αυξάνει την αναγνωσιμότητα του προγράμματος Επαναχρησιμοποίηση! 35
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Τα 6 βήματα που πάντοτε ακολουθούνται για την εκτέλεση μιας συνάρτησης: 1. Αποθήκευση παραμέτρων σε χώρο που έχει πρόσβαση η συνάρτηση 2. Μεταφορά ελέγχου στη συνάρτηση 3. Απόκτηση αποθηκευτικών χώρων που απαιτούνται για την εκτέλεση της συνάρτησης 4. Διεξαγωγή (εκτέλεση) των εντολών της συνάρτησης 5. Αποθήκευση αποτελεσμάτων σε χώρο που έχει πρόσβαση το κύριο πρόγραμμα (calling program) 6. Επιστροφή ελέγχου στο σημείο προέλευσης του κύριου προγράμματος 36
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Καταχωρητές για κλήση συνάρτησης: $a0 - $a3: καταχωρητές μεταβίβασης παραμέτρων στη συνάρτηση (4) $v0 - $v1: καταχωρητές αποθήκευσης αποτελεσμάτων προς το κύριο πρόγραμμα (2) $ra : καταχωρητής διεύθυνσης επιστροφής στο σημείο προέλευσης του κύριου προγράμματος Εντολή Κλήσης Συνάρτησης: jal ProcedureAddress εντολή jump-and-link: προχωρεί στη διεύθυνση της συνάρτησης ενώ συγχρόνως αποθηκεύει την διεύθυνση της εντολής που ακολουθεί τη συνάρτηση στον ειδικό καταχωρητή $ra, δηλ., καλεί τη συνάρτηση 37
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Η έννοια του αποθηκεμένου προγράμματος υπονοεί ότι η διεύθυνση της εντολής που εκτελείται είναι πάντα γνωστή Φυλάγεται σε ένα καταχωρητή που ονομάζεται Μετρητής Προγράμματος (Program Counter -- PC) jal αποθηκεύει PC + 4 στον $ra. Γιατί? Πως επιστρέφουμε στο κύριο πρόγραμμα από μια συνάρτηση? jr $ra # άλμα (χωρίς συνθήκη) στη διεύθυνση # στον καταχωρητή $ra 38
Υποστήριξη Διαδικασιών από Υλικό (συν.) Συνοπτικά: Caller (= Κύριο Πρόγραμμα ή άλλη Συνάρτηση) Αποθηκεύει παραμέτρους στους $a0 - $a3 Εκτελεί την εντολή jal ProcedureAddress για να καλέσει την συνάρτηση Callee (= Συνάρτηση που καλείται) Εκτελεί τους υπολογισμούς της συνάρτησης Αποθηκεύει τα αποτελέσματα στους $v0 - $v1 Εκτελεί την εντολή jr $ra για να επιστρέψει στο κύριο πρόγραμμα ή την εντολή που την κάλεσε 39
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Τι συμβαίνει αν η συνάρτηση απαιτεί περισσότερους καταχωρητές; Το περιεχόμενο των καταχωρητών που χρησιμοποιούνται από τη συνάρτηση αποθηκεύονται πριν αυτή καλεστεί, γιαναμπορούννα επαναφερθούν όταν η συνάρτηση τερματίσει/επιστρέψει Η αποθήκευση του περιεχόμενου καταχωρητών στη μνήμη ονομάζεται memory (or register) spilling Χρησιμοποιούμε τη στοίβα (stack) = δομή δεδομένων για αποθήκευση καταχωρητών, μέρος της μνήμης, δομή LIFO Δείκτης Στοίβας (Stack Pointer -- $sp) δείχνει στην πιο πρόσφατα καταχωρημένη διεύθυνση στη στοίβα (most recently allocated address in the stack) Χρησιμοποιούμε pop και push λειτουργίες για στοίβες 40
Παράδειγμα Θεωρήστε την πιο κάτω συνάρτηση σε C: int leaf_example (int g, int h, int i, int j) { int f; } f = (g + h) (i + j); return f; g $a0, h $a1, I $a2, j $a3, f $s0 Δώστε τον μεταγλωττισμένο κώδικα σε MIPS Assembly 41
Παράδειγμα (συν.) Leaf_example: # καλεί την συνάρτηση Register spilling στη στοίβα (push) addi $sp, $sp, -12 sw $t1, 8($sp) sw $t0, 4($sp) sw $s0, 0($sp) # κρατά χώρο στη στοίβα για 3 δεδομένα # φύλαξη (push) $t1 στη στοίβα # φύλαξη (push) $t0 στη στοίβα # φύλαξη (push) $s0 στη στοίβα Μεγάλη διεύθυνση Μεγάλη διεύθυνση Μεγάλη διεύθυνση $sp $sp-4 $sp-8 $sp-12 $sp+12 $sp+8 $sp+4 $sp $sp+12 $sp+8 $sp+4 $sp δεδομένα καταχωρητή $t1 δεδομένα καταχωρητή $t0 δεδομένα καταχωρητή $s0 Μικρή διεύθυνση Μικρή διεύθυνση Μικρή διεύθυνση Αρχικά η στοίβα είναι άδεια addi $sp, $sp, -12 sw sw sw $t1, 8($sp) $t0, 4($sp) $s0, 0($sp) 42
Παράδειγμα (συν.) Κυρίως Μέρος της συνάρτησης Αποθήκευση τιμής αποτελέσματος Επαναφορά καταχωρητών (pop) add $t0, $a0, $a1 add $t1, $a2, $a3 # $t0 = g + h # $t1 = i + j sub $s0, $t0, $t1 # f = (g + h) (i + j) add $v0, $s0, $zero # επιστροφή αποτελέσματος στον $v0 = f = $s0 + 0 lw $s0, 0($sp) lw $t1, 4($sp) lw $t0, 8($sp) addi $sp, $sp, 12 # επαναφορά $s0 από στοίβα # επαναφορά $t1 από στοίβα # επαναφορά $t0 από στοίβα # αφαίρεση 3 στοιχείων από την στοίβα Επιστροφή jr $ra # επιστροφή = jump πίσω στον caller 43
Επαναφορά καταχωρητών από στοίβα push (αποθήκευση) pop (επαναφορά) Μεγάλη διεύθυνση Μεγάλη διεύθυνση Μεγάλη διεύθυνση $sp+12 $sp+8 $sp+4 $sp δεδομένα καταχωρητή $t1 δεδομένα καταχωρητή $t0 δεδομένα καταχωρητή $s0 $sp+12 $sp+8 $sp+4 $sp δεδομένα καταχωρητή $t1 δεδομένα καταχωρητή $t0 δεδομένα καταχωρητή $s0 $sp $sp-4 $sp-8 $sp-12 Μικρή διεύθυνση Μικρή διεύθυνση Μικρή διεύθυνση $s0 sw sw sw $t1, 8($sp) $t0, 4($sp) $s0, 0($sp) δεδομένα $s0 $s0 lw lw lw $s0, 0($sp) $t0, 4($sp) $t1, 8($sp) δεδομένα απότηδιεύθυνση$sp+0 addi $sp, $sp, 12 Αφαίρεση στοιχείων από στοίβα, επαναφορά δείκτη στοίβας στην αρχική τιμή $t0 δεδομένα $t0 $t0 δεδομένα απότηδιεύθυνση$sp+4 $t1 δεδομένα $t1 $t1 δεδομένα απότηδιεύθυνση$sp+8 44
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Πως γνωρίζουμε ποιος καταχωρητής πρέπει να φυλαχθεί πριν την εκτέλεση μιας συνάρτησης; Στη MIPS, οι καταχωρητές χωρίζονται σε 2 κατηγορίες: 1. $t0 - $t9: προσωρινοί καταχωρητές, δεν διατηρούνται 2. $s0 - $s7: αποθηκεμένοι (saved) καταχωρητές, πρέπει να διατηρηθούν αν χρησιμοποιούνται από συνάρτηση 45
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Φωλιασμένες Συναρτήσεις: Μια συνάρτηση που ΔΕΝ καλεί άλλη συνάρτηση ή δεν έχει αναδρομή ονομάζεται leaf συνάρτηση Στην πράξη, πολλές συναρτήσεις δεν είναι αυτού του τύπου Είτε καλούν άλλες συναρτήσεις και/ή καλούν αναδρομικά τον εαυτό τους Θεωρήστε το πιο κάτω: Συνάρτηση A με παράμετρο 5($a0 = 5, $ra αναθέτεται) καλείται από το κύριο πρόγραμμα Συνάρτηση B με παράμετρο 10 (($a0 = 10, $ra αναθέτεται ξανά) καλείται από την συνάρτηση A Μπορεί η A να συνεχίσει με έγκυρα δεδομένα; Μπορεί η A να επιστρέψει στο κύριο πρόγραμμα; Χρησιμοποιούμε στοίβες ξανά (περισσότερα στο Εργαστήριο!!) 46
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Στατικά (Static) Vs Αυτόματα (Automatic) δεδομένα: Θυμηθείτε την κατηγορία μεταβλητών στατικής μνήμης (static storage class) στη C οι μεταβλητές ισχύουν για ολόκληρο το πρόγραμμα (συμπεριλαμβανομένων όλων των συναρτήσεων) κοινές (public) μεταβλητές Σε αντίθεση, η κατηγορία μεταβλητών αυτόματης μνήμης (automatic storage class): οι μεταβλητές ισχύουν μόνο μέσα στη συνάρτηση από την οποία έχουν οριστεί τοπικές (local) μεταβλητές H MIPS ορίζει τον καταχωρητή $gp ως γενικό δείκτη (global pointer) ο οποίος χρησιμοποιείται για να δείχνει στο κομμάτι της μνήμης που περιέχει τα στατικά δεδομένα/μεταβλητές 47
Πολιτική Χρήσης Καταχωρητών Όνομα Αρ. Καταχωρητή Χρήση Φυλάγεται από συναρτήσεις; $zero 0 έχει πάντα την τιμή 0 - $v0-$v1 2-3 κρατούν τιμές αποτελεσμάτων που επιστρέφονται από συναρτήσεις όχι $a0-$a3 4-7 παραμέτροι συναρτήσεων όχι $t0-$t7 8-15 προσωρινοί όχι $s0-$s7 16-23 αποθηκεμένοι ναι $t8-$t9 24-25 επιπρόσθετοι προσωρινοί όχι $gp 28 γενικός δείκτης (global pointer) ναι $sp 29 δείκτης στοίβας (stack pointer) ναι $fp 30 δείκτης πλαισίου διαδικασίας (frame pointer) ναι $ra 31 διεύθυνση επιστροφής ναι Ο καταχωρητής 1 (ή $at) χρησιμοποιείται αποκλειστικά από τον συμβολομεταφραστή και οι καταχωρητές 26-27 (ή $k0-$k1) χρησιμοποιούνται αποκλειστικά από το λειτουργικό σύστημα 48
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Κατανομή μνήμης στη στοίβα για επιπρόσθετα δεδομένα από συναρτήσεις: Οι στοίβα μπορεί να χρησιμοποιηθεί και για αποθήκευση τοπικών δεδομένων/μεταβλητών μιας συνάρτησης. Αυτό συμβαίνει όταν τα τοπικά δεδομένα/μεταβλητές μιας συνάρτησης δεν μπορούν όλα να αποθηκευτούν σε καταχωρητές (π.χ. πίνακες) Πλαίσιο Συνάρτησης (procedure frame ή activation record): κομμάτι της στοίβας που περιέχει τους αποθηκεμένους καταχωρητές καιτατοπικάδεδομέναμιαςσυνάρτησης Δείκτης Πλαισίου (frame pointer) -- $fp: ο καταχωρητής που δείχνει στο πλαίσιο μιας συνάρτησης (δηλ., έχει την αρχική διεύθυνση που δείχνει στην 1 η λέξητουπλαισίουμιας συνάρτησης) 49
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Μεγάλη διεύθυνση Μεγάλη διεύθυνση Μεγάλη διεύθυνση $sp, $fp $sp-4 $sp-8 $sp-12 Μικρή διεύθυνση $fp $sp Μικρή διεύθυνση Καταχωρητές παραμέτρων Διεύθυνση επιστροφής Αποθηκεμένοι καταχωρητές Τοπικά Δεδομένα Συνάρτησης $sp, $fp $sp-4 $sp-8 $sp-12 Μικρή διεύθυνση (α) (β) (γ) Κατανομή στοίβας (α) πριν, (β) μετά, και (γ) κατά τη διάρκεια κλήσεως συνάρτησης: $fp δείχνει στην 1 η λέξη του πλαισίου της συνάρτησης $sp δείχνει στην αρχή της στοίβας $sp αλλάζει κατά τη διάρκεια εκτέλεσης της συνάρτησης ενώ ο $fp είναι αμετάβλητος, άρα, για πρόσβαση στα δεδομένα χρησιμοποιείται ο $fp $fp αρχικοποιείται με την τιμή του $sp και η τιμή του $sp επαναφέρεται στο τέλος από τον $fp 50
Υποστήριξη Συναρτήσεων από Υλικό (συν.) Κατανομή μνήμης για επιπρόσθετα δεδομένα στη σωρό (heap) $sp 7fff fffc hex Στοίβα (Stack) $gp $pc 1000 8000 hex 1000 0000 hex 0040 0000 hex 0 hex Δυναμικά Δεδομένα (Dynamic Data) Στατικά Δεδομένα (Static Data) Εντολές (Text) Λειτουργικό Σωρός: κομμάτι της μνήμης που παραχωρείται για δυναμικά δεδομένα (dynamic data) (malloc(), free()) Γλώσσα μηχανής του προγράμματος που εκτελείται Μνήμη 51
Επεξεργασία κειμένου Η αρχιτεκτονική MIPS παρέχει εντολές χρήσιμες για επεξεργασία κειμένου Θυμάστε τον κώδικα ASCII; 8-bit κώδικες για χαρακτήρες lb : φορτώνει ένα byte απότημνήμηστα8 πιο δεξιά bits ενός καταχωρητή sb: αποθηκεύει τα 8 πιο δεξιά bits ενός καταχωρητή στη μνήμη Για αντιγραφή ενός byte από ένα μέρος της μνήμης σε ένα άλλο μέρος της μνήμης: lb $t0, 0($sp) # διαβάζει 1 byte (= 1 χαρακτήρας) από $sp+0 στο $t0 sb $t0, 0($gp) # γράφει 1 byte από $t0 (= 1 χαρακτήρας) στη $gp+0 H MIPS επίσης υποστηρίζει εντολές για φόρτωση/αποθήκευση μισών λέξεων (half words = 16 bits), χρήσιμες για τον κώδικα Unicode που χρησιμοποιεί η Java lh $t0, 0($sp) # διαβάζει 2 bytes (= 1 χαρακτήρας) από $sp+0 στο $t0 sh $t0, 0($gp) # γράφει 2 bytes από $t0 (= 1 χαρακτήρας) στη $gp+0 52
Σταθεροί και Διευθύνσεις 32-bit Θέλουμε να φορτώσουμε ένα σταθερό με 32-bits σε ένα καταχωρητή, π.χ. 10101010101010100000000011111111 στον καταχωρητή $t0 Χρειαζόμαστε 2 εντολές: Καινούρια εντολή "load upper immediate" (φορτώνει στα 16 πιο σημαντικά bits) lui $t0, 1010101010101010 Machine code $t0 001111 00000 01000 1010101010101010 1010101010101010 0000000000000000 Συμπλήρωση με μηδενικά Για να πάρουμε τα 16 λιγότερο σημαντικά bits χρησιμοποιούμε την λογική εντολή: ori $t0, $t0, 0000000011111111 $t0 ori $t0 1010101010101010 0000000000000000 0000000000000000 0000000011111111 1010101010101010 0000000011111111 Στη MIPS, ο assembler είναι υπεύθυνος για τη δημιουργία των «μεγάλων» σταθερών ή διευθύνσεων (long constants/addresses) χρησιμοποιώντας τον ειδικό καταχωρητή $at 53
Κώδικας Assembly vs. Γλώσσα Μηχανής Η Assembly παρέχει συμβολική αναπαράσταση των εντολών, για λόγους διευκόλυνσης του προγραμματιστή Πολύ πιο εύκολο από το να γράφουμε με δυαδικούς / δεκαεξαδικούς αριθμούς Τυποποίηση, π.χ. ο καταχωρητής του αποτελέσματος πάντα πρώτος Η γλώσσα μηχανής (Machine language) είναι η πραγματικότητα που κρύβεται πίσω από την Assembly Π.χ. ο καταχωρητής του αποτελέσματος ΔΕΝ είναι πάντα πρώτος Η Assembly παρέχει «ψευδοεντολές» (pseudoinstructions) Π.χ., η εντολή move $t0, $t1 υπάρχει μόνο στην Assembly Η υλοποίηση της (== γλώσσα μηχανής) γίνεται με την εντολή add $t0,$t1,$zero Για ανάλυση απόδοσης πρέπει να μετρούμε τον αριθμό των πραγματικών εντολών, όχι των ψευδοεντολών 54
Επισκόπηση MIPS για διατάξεις εντολών Απλές εντολές, όλες των 32 bits Δομημένες εντολές, τυποποίηση Μόνο τρεις διαφορετικές διατάξεις εντολών R I J op rs rt rd shamt funct op rs rt 16 bit address op 26 bit address Βασιζόμαστε στον μεταγλωττιστή για επίτευξη απόδοσης ποιοι θα πρέπει να είναι οι στόχοι του μεταγλωττιστή; Πρέπει να βοηθούμε τον μεταγλωττιστή, όπου χρειάζεται, μέσω σωστού προγραμματισμού 55
Διευθύνσεις για Branches και Jumps Εντολές: bne $t4,$t5,label # Επόμενη εντολή στο Label εάν $t4 $t5 beq $t4,$t5,label # Επόμενη εντολή στο Label εάν $t4 = $t5 j Label # Επόμενη εντολή στο Label Διατάξεις εντολών: I J op rs rt 16 bit address op 26 bit address Οι διευθύνσεις στις δύο πιο πάνω διατάξεις δεν μπορούν να είναι 32 bits (μέγιστο 2 16 για I-type και 2 26 για J-type) Υποδηλώνει ότι κανένα πρόγραμμα δεν μπορεί να είναι μεγαλύτερο από 2 16 bytes ή 2 26 bytes (γιατί bytes και όχι bits;) Η μνήμη στη MIPS έχει 2 32 bytes (ή 2 30 words = 4Gbytes). Πως μπορούμε να έχουμε πρόσβαση σε ολόκληρη τη μνήμη από εντολές μεταφοράς δεδομένων (load/store); 56
Διευθύνσεις για Branches και Jumps (συν.) Εντολές διακλάδωσης υπό συνθήκη : bne $t4,$t5,label # Επόμενη εντολή στο Label εάν $t4 $t5 beq $t4,$t5,label # Επόμενη εντολή στο Label εάν $t4=$t5 (το Label είναι ουσιαστικά διεύθυνση που θα αποφασιστεί σε μεταγενέστερο στάδιο από τον μεταγλωττιστή/συμβολομεταφραστή) Διάταξη εντολής: I Διεύθυνση διακλάδωσης op rs rt 16 bit address Μπορούμε να καθορίσουμε ένα καταχωρητή του οποίου τα δεδομένα θα προστεθούν στην διεύθυνση της διακλάδωσης (όπως γίνεται για τις εντολές lw και sw). Έτσι, η εντολή διακλάδωσης θα υπολογίσει: PC = τιμή καταχωρητή + διεύθυνση διακλάδωσης Αυτό επιτρέπει σε ένα πρόγραμμα να είναι μέχρι και 2 32 bytes και συγχρόνως να μπορεί να χρησιμοποιεί διακλαδώσεις υπό συνθήκη Αυτός ο τρόπος διευθυνσιοδότησης ονομάζεται relative addressing mode (η πραγματική διεύθυνση διακλάδωσης υπολογίζεται σχετικά με τα δεδομένα ενός καταχωρητή) Οι περισσότερες διακλαδώσεις υπό συνθήκη είναι τοπικές (ακολουθούν την αρχή της τοπικότητας), και επομένως χρησιμοποιούμε: PC-relative addressing: PC = PC + διεύθυνση διακλάδωσης 57
Διευθύνσεις για Branches και Jumps (συν.) Εντολή άλματος (jump): j Label # Επόμενη εντολή στο Label jal Label # Καλεί την συνάρτηση Label Διάταξη εντολής: Διεύθυνση Άλματος J op 26-bit address Ψευδοάμεση Διευθυνσιοδότηση (Pseudodirect addressing) PC = 4 MSBs του PC && διεύθυνση άλματος Οι εντολές άλματος χρησιμοποιούν τα 4 πιο σημαντικά ψηφία (MSBs) του PC Παρέχει πρόσβαση στις διευθύνσεις μεταξύ των 64 Mbytes 1Gbyte. Γιατί; Ποιο είναι το μέγιστο της διεύθυνσης άλματος; (2 26-1 64 Mbyte?) 58
Διευθύνσεις για Branches και Jumps (συν.) H MIPS αυξάνει την απόσταση των διακλαδώσεων και των αλμάτων περαιτέρω: ΗδιεύθυνσηMIPS είναι σχετική με την επόμενη εντολή (PC+4) αντί την τρέχουσα εντολή (PC) Η διεύθυνση αναφέρεται σε λέξεις (words - w) αντί σε bytes (b, όπου w = b*4) Έτσι, η διεύθυνση διακλάδωσης ή άλματος μπορεί να είναι 4 φορές μεγαλύτερη PC-relative addressing γίνεται: PC = (PC+4) + (διεύθυνση διακλάδωσης *4) Pseudodirect addressing γίνεται: PC = 4 MSBs του PC && (διεύθυνση άλματος *4) 59
Παράδειγμα Θυμηθείτε τον βρόχο (σελ. 74): while (save[i] == k) i++; Loop: sll $t1, $s3, 2 # $t1 = 4*i add $t1, $t1, $s6 # $t1 = address of save[i] lw $t0, 0($t1) # $t0 = save[i] bne $t0, $s5, Exit # go to Exit if save[i] k addi $s3, $s3, 1 # i++ j Loop # loop again Exit: # out of the loop Μεταγλωττισμένες εντολές και οι διευθύνσεις αποθήκευσής τους 80000 0 0 19 9 2 0 80004 0 9 22 9 0 32 80008 35 9 8 0 80012 5 8 21 2 80016 8 19 19 1 80020 2 20000 80024 Loop: sll add lw bne addi j Exit: 60
Παράδειγμα (συν.) PC-relative addressing για bne $t0, $s5, Exit PC = (PC+4 ) + (διεύθυνση διακλάδωσης *4) PC = (80012+4) + (2*4) = 80024 (διεύθυνση του Exit) Pseudodirect addressing για j Loop PC = (4 MSBs of PC) + (διεύθυνση άλματος *4) PC = (0000) 2 && (20000*4) 10 = 80000 10 (διεύθυνση του Loop) Μεταγλωττισμένες εντολές και οι διευθύνσεις αποθήκευσής τους 80000 0 0 19 9 2 0 Loop: sll 80004 0 9 22 9 0 32 add 80008 35 9 8 0 lw 80012 5 8 21 2 bne 80016 8 19 19 1 addi 80020 2 20000 j 80024 Exit: 61
Εναλλακτικός τρόπος για μακρινή διακλάδωση Θεωρήστε ότι $s0 = $s1. Αντικαταστήστε την πιο κάτω εντολή με μία ή περισσότερες εντολές έτσι ώστε να αυξηθεί η απόσταση της διακλάδωσης (branching distance) beq $s0, $s1, L1 62
Εναλλακτικός τρόπος για μακρινή διακλάδωση Θεωρήστε ότι $s0 = $s1. Αντικαταστήστε την πιο κάτω εντολή με μία ή περισσότερες εντολές έτσι ώστε να αυξηθεί η απόσταση της διακλάδωσης (branching distance) beq $s0, $s1, L1 Λύση: bne j L2: $s0, $s1, L2 L1 Μπορεί κάποιος να εξηγήσει τι έγινε? 63
Συνοπτικά: MIPS operands Name Example Comments $s0-$s7, $t0-$t9, $zero, Fast locations for data. In MIPS, data must be in registers to perform 32 registers $a0-$a3, $v0-$v1, $gp, arithmetic. MIPS register $zero always equals 0. Register $at is $fp, $sp, $ra, $at reserved for the assembler to handle large constants. Memory[0], Accessed only by data transfer instructions. MIPS uses byte addresses, so 2 30 memory Memory[4],..., sequential words differ by 4. Memory holds data structures, such as arrays, words Memory[4294967292] and spilled registers, such as those saved on procedure calls. MIPS assembly language Category Instruction Example Meaning Comments add add $s1, $s2, $s3 $s1 = $s2 + $s3 Three operands; data in registers Arithmetic subtract sub $s1, $s2, $s3 $s1 = $s2 - $s3 Three operands; data in registers add immediate addi $s1, $s2, 100 $s1 = $s2 + 100 Used to add constants load word lw $s1, 100($s2) $s1 = Memory[$s2 + 100] Word from memory to register store word sw $s1, 100($s2) Memory[$s2 + 100] = $s1 Word from register to memory Data transfer load byte lb $s1, 100($s2) $s1 = Memory[$s2 + 100] Byte from memory to register store byte sb $s1, 100($s2) Memory[$s2 + 100] = $s1 Byte from register to memory load upper immediate lui $s1, 100 $s1 = 100 * 2 16 Loads constant in upper 16 bits branch on equal beq $s1, $s2, 25 if ($s1 == $s2) go to PC + 4 + 100 branch on not equal bne $s1, $s2, 25 if ($s1!= $s2) go to Conditional PC + 4 + 100 branch set on less than slt $s1, $s2, $s3 if ($s2 < $s3) $s1 = 1; else $s1 = 0 Equal test; PC-relative branch Not equal test; PC-relative Compare less than; for beq, bne set less than immediate slti $s1, $s2, 100 if ( $s2 < 100) $s1 = 1; else $s1 = 0 Compare less than constant jump j 2500 go to 10000 Jump to target address Uncondi- jump register jr $ra go to $ra For switch, procedure return tional jump jump and link jal 2500 $ra = PC + 4; go to 10000 For procedure call 64
Τρόποι Καθορισμού Διεύθυνσης (Συνοπτικά): 1. Immediate addressing op rs rt Immediate 2. Register addressing op rs rt rd... funct Registers Register 3. Base addressing op rs rt Address Memory Register + Byte Halfword Word 4. PC-relative addressing op rs rt Address Memory PC + Word 5. Pseudodirect addressing op Address Memory PC Word 65
Μετάφραση και Εκτέλεση Προγράμματος (x.c x.c) Πρόγραμμα C (Αρχεία Unix Αρχεία Dos) Μεταγλωττιστής (x.s x.asm) Πρόγραμμα Assembly Συμβολομεταφραστής (x.o x.obj) (x.a,x.so x.lib, x.dll) Γλώσσα Μηχανής για Πρόγραμμα C Βιβλιοθήκες σε Γλώσσα Μηχανής Συνδετικός Συντάκτης Μνήμη Φορτωτής Εκτελέσιμο Πρόγραμμα (Γλώσσα Μηχανής) (a.out x.exe) 66
Μεταγλωττιστής (Compiler) Πρόγραμμα C Μεταγλωττιστής Πρόγραμμα Assembly Μεταφράζει από γλώσσα υψηλού επιπέδου σε κώδικα assembly Πολύπλοκο πρόγραμμα (η ανάπτυξη μεταγλωττιστών αποτελεί συνήθως ολόκληρο μάθημα που διδάσκεται στο 4 ο έτος, θεωρείται ως ένα από τα πιο δύσκολα μαθήματα!) 67
Συμβολομεταφραστής (Assembler) Πρόγραμμα Assembly Συμβολομεταφραστής Γλώσσα Μηχανής για Πρόγραμμα C Διασύνδεση μεταξύ του λογισμικού και του υλικού ενός υπολογιστή Μπορούμε να χρησιμοποιήσουμε ψευδοεντολές, όπως: move add με $zero blt slt, bne mult sll Ο συμβολομεταφραστής της MIPS χρησιμοποιεί το δεκαεξαδικό σύστημα αριθμών 68
Συμβολομεταφραστής (συν.) Το αρχείο του εκτελέσιμου κώδικα περιέχει (στο Unix): 1. Κεφαλίδα (Header): καθορίζει το μέγεθος/τοποθεσία των υπολοίπων μερών 2. Κείμενο (Text segment): περιέχει τη γλώσσα μηχανής (εκτελέσιμο κώδικα) 3. Στατικά δεδομένα (Static data segment): τα στατικά δεδομένα του προγράμματος 4. Πληροφορίες μετατόπισης (Relocation information): προσδιορίζει λέξεις εντολών/δεδομένων βάση απόλυτων διευθύνσεων 5. Πίνακας συμβόλων (Symbol table): ταιριάζει τα ονόματα των labels με απόλυτες διευθύνσεις (word addresses) στη μνήμη 6. Πληροφορίες αποσφαλμάτωσης (Debugging information): περιγραφή του τρόπου μεταγλωττισμού ώστε να μπορεί να συσχετιστεί η γλώσσα της μηχανής με τις εντολές γλώσσας υψηλού επιπέδου (π.χ. C). 69
Συνδετικός Συντάκτης (Linker or Link Editor) Γλώσσα Μηχανής για Πρόγραμμα C Βιβλιοθήκες σε Γλώσσα Μηχανής Συνδετικός Συντάκτης Εκτελέσιμο Πρόγραμμα (Γλώσσα Μηχανής) Συνδυάζει προγράμματα που έχουν μεταγλωττιστεί και συμβολομεταφραστεί ανεξάρτητα σε ένα ενιαίο εκτελέσιμο κώδικα Επιτρέπει τη χρήση προκαθορισμένων και ήδη συμβολομεταφρασμένων βιβλιοθηκών κώδικα Επιλύει όλα τα ακαθόριστα labels (σε απόλυτες διευθύνσεις) Χρησιμοποιεί τις πληροφορίες μετατόπισης και τον πίνακα συμβόλων που είναι μέρη του εκτελέσιμου αρχείου (object file) Καθορίζει την απόλυτη διεύθυνση στη μνήμη για την κάθε συνάρτηση / ενότητα (δείτε περισσότερα στο βιβλίο σας, παράδειγμα στις σελ. 109-111) 70
Φορτωτής (Loader) Εκτελέσιμο Πρόγραμμα (Γλώσσα Μηχανής) Φορτωτής Μνήμη Τοποθετεί το εκτελέσιμο πρόγραμμα (machine code με απόλυτες διευθύνσεις) στην κυρίως μνήμη Πρέπει να εντοπίσει αρκετό χώρο στη μνήμη που να μπορεί να κρατήσει ολόκληρο το πρόγραμμα Αντιγράφει τα δεδομένα από τον δίσκο στη μνήμη Αντιγράφει τις παραμέτρους του προγράμματος στη στοίβα Αρχικοποιεί τους καταχωρητές και θέτει τον δείκτη στοίβας Πηδά στην διεύθυνση της αρχικής συνάρτησης 71
Στατικές και Δυναμικές Βιβλιοθήκες (Static vs. Dynamic Libraries) Στατικές Οι βιβλιοθήκες συνδέονται και φορτώνονται πριν την εκτέλεση του προγράμματος Γρηγορότερη εκτέλεση Καινούριες εκδόσεις πρέπει να ξανα-συνδεθούν και να ξανα-φορτωθούν Απαιτεί περισσότερο χώρο (φορτώνεται ολόκληρη η βιβλιοθήκη) Δυναμικές Οι βιβλιοθήκες ΔΕΝ συνδέονται ΟΥΤΕ φορτώνονται ΜΕΧΡΙ τη στιγμή που εκτελείται το πρόγραμμα Πιο αργή εκτέλεση Οι καινούριες εκδόσεις υποστηρίζονται αυτόματα Μειωμένος χώρος Σύνδεση Lazy procedure: μια ρουτίνα συνδέεται μόνο αφότου έχει καλεστεί, έτσι δεν συνδέονται/φορτώνονται αχρησιμοποίητες ρουτίνες 72
Άλλες Αρχιτεκτονικές (ISAs) Εναλλακτικές Σχεδιασμού: Παροχή πιο ισχυρών εντολών Ο στόχος είναι να μειωθεί ο αριθμός των εντολών που εκτελούνται για να διεκπεραιωθεί μια λειτουργία Ο κίνδυνος έγκειται στην αύξηση της περιόδου του ρολογιού (cycle time) και/ή τουcpi (CPI = αριθμός Clock cycles Per Instruction) The path toward operation complexity is thus fraught with peril. To avoid these problems, designers have moved toward simpler instructions ΘαδούμεσεσυντομίατοISA της Intel IA-32 73
Intel IA - 32 1978: Ανακοινώνεται ο Intel 8086 (16 bit architecture), προέκταση του 8080 (8-bit architecture). Όχι γενικής χρήσεως καταχωρητές. 1980: Προσθήκη του 8087 με δυνατότητα αναπαράστασης κινητής υποδιαστολής (60 καινούριες fp εντολές) 1982: Ο 80286 αυξάνει το μέγεθος των διευθύνσεων σε 24 bits, + νέες εντολές 1985: Ο 80386 επεκτείνει σε 32 bits, νέους τρόπους διευθυνσιοδότησης μηχανή με καταχωρητές γενικής χρήσεως 1989-1995: Οι 80486, Pentium, Pentium Pro προσθέτου κάποιες καινούριες εντολές (έχουν βελτιστοποιηθεί κυρίως για μεγαλύτερη απόδοση) 1997: 57 νέες MMX (Multi Media extension) εντολές στον Pentium II 1999: Ο Pentium III πρόσθεσε άλλες 70 εντολές (SSE=Streaming SIMD), και 8 ξεχωριστούς καταχωρητές των 128-bits 2001: Άλλες 144 εντολές (SSE2) στον Pentium 4 2003: AMD επεκτείνει την αρχιτεκτονική και αυξάνει το μέγεθος των διευθύνσεων σε 64 bits, πλάτυνε όλους τους καταχωρητές σε 64 bits, κτλ (AMD64) 2004: Η Intel συνθηκολογεί και ενστερνίζεται τον AMD64 (τον ονομάζει EM64T) και προεκτείνει με επιπρόσθετες εντολές για πολυμέσα This history illustrates the impact of the golden handcuffs of compatibility (keep extending architecture for software s sake) adding new features as someone might add clothing to a packed bag an architecture that is difficult to explain and impossible to love 74
IA-32 - Συνοπτικά Πολυπλοκότητα: Οι εντολές διαφέρουν σε μέγεθος από 1 σε 17 bytes Ένας τελεστής λειτουργεί και ως τελεστής πηγής και τελεστής αποτελέσματος Ένας τελεστής μπορεί να έρθει απευθείας από τη μνήμη Πολύπλοκοι τρόποι διευθυνσιοδότησης π.χ., βάση ή κλιμακωτός δείκτης με μετακίνηση 8 ή 32 bit Για εύκολη μεταχείριση : Οι πιο συχνο-χρησιμοποιημένες εντολές δεν είναι δύσκολο να υλοποιηθούν Οι μεταγλωττιστές αποφεύγουν τα μέρη της αρχιτεκτονικής που είναι αργά what the 80x86 lacks in style is made up in quantity, making it beautiful from the right perspective 75
IA-32: Καταχωρητές και Τρόπος Καθορισμού Διεύθυνσης Δεδομένων Οι καταχωρητές των 32-bit προέρχονται από τον 80386 Name 31 0 Use EAX GPR 0 ECX EDX EBX ESP EBP ESI EDI GPR 1 GPR 2 GPR 3 GPR 4 GPR 5 GPR 6 GPR 7 CS SS DS ES FS GS Code segment pointer Stack segment pointer (top of stack) Data segment pointer 0 Data segment pointer 1 Data segment pointer 2 Data segment pointer 3 EIP EFLAGS Instruction pointer (PC) Condition codes 76
IA-32 Περιορισμοί Καταχωρητών Οι καταχωρητές δεν είναι όλοι γενικής χρήσεως προσέξετε τους περιορισμούς που φαίνονται πιο κάτω 77
IA-32 Τυπικές Εντολές 4 βασικά είδη εντολών ακεραίων: Μεταφορά δεδομένων, συμπεριλαμβανομένων των move, push, pop Αριθμητικές και λογικές (αποτέλεσμα σε καταχωρητή ή μνήμη) Ροή Ελέγχου (χρήση condition codes / flags ) Εντολές στοιχειοσειρών, συμπεριλαμβανομένων των string move και string compare 78
IA-32 Διατάξεις Εντολών Τυπικές μορφές: (προσέξετε το διαφορετικό μέγεθος, σε αντίθεση με τη MIPS όπου το μέγεθος είναι σταθερό) a. JE EIP + displacement 4 4 8 JE Condition Displacement b. CALL 8 32 CALL Offset c. MOV EBX, [EDI + 45] 6 1 1 8 8 MOV d w r/m Postbyte Displacement d. PUSH ESI 5 3 PUSH Reg e. ADD EAX, #6765 4 3 1 32 ADD Reg w Immediate f. TEST EDX, #42 7 1 8 32 TEST w Postbyte Immediate 79
Βασικά συμπεράσματα 2 ου Κεφαλαίου Η πολυπλοκότητα του συνόλου εντολών είναι μόνο ένας παράγοντας που επηρεάζει την απόδοση ενός υπολογιστή Μικρότερος αριθμός εντολών vs. Μεγαλύτερο CPI ή μικρότερο κύκλο/περίοδο ρολογιού Αρχές Σχεδιασμού: «Η απλότητα ευνοεί την κανονικότητα» (simplicity favors regularity) «Το μικρότερο είναι και το γρηγορότερο» (smaller is faster) «Ο καλός σχεδιασμό απαιτεί συμβιβασμό» (good design demands compromise) «Η συνήθης πράξη πρέπει να είναι γρήγορη» (Make the common case fast) Αρχιτεκτονική Συνόλου Εντολών (Instruction Set Architecture ISA) Ένα σημαντικότατο μοντέλο αφαιρετικότητας! 80
Άλλα σημαντικά θέματα Βελτιστοποίηση Μεταγλωττιστή Πίνακες vs. Δείκτεςσεγλώσσαυψηλούεπιπέδουκαι ο αντίκτυπός τους στην Assembly Μεγαλύτερα/ολοκληρωμένα παραδείγματα μετάφρασης από υψηλή γλώσσα επιπέδου σε Assembly και γλώσσα μηχανής Όλα τα πιο πάνω θέματα θα εξεταστούν με περισσότερη λεπτομέρεια στο εργαστήριο (ΗΜΥ 213). 81