Οργάνωση Υπολογιστών 5 “συστατικά” στοιχεία -Επεξεργαστής: datapath (δίοδος δεδομένων) (1) και control (2) -Μνήμη (3) -Συσκευές Εισόδου (4), Εξόδου (5) (Μεγάλη ‘ποικιλία’ !!) Συσκευές γρήγορες π.χ. κάρτες γραφικών, αργές π.χ. πληκτρολόγιο. Για το Ι/Ο έχει γίνει η λιγότερη έρευνα …..(I/O busses , I/O switched fabrics …) Ιεραρχία Μνήμης: καταχωρητές, κρυφή μνήμη (L1), κρυφή μνήμη (L2), κύρια Μνήμη Μνήμη- ΠΟΛΥ ΣΗΜΑΝΤΙΚΟ ΣΤΟΙΧΕΙΟ! 7/2/2011 cslab@ntua 2010-2011 1 Αρχιτεκτονικές Συνόλου Εντολών Instruction Set Architectures Instruction Fetch ((IF)) Instruction Decode (ID) Operand Fetch (OF) Execute (Ex) Result Store (WB) Next Instruction 7/2/2011 Αριθμός εντολών Μορφή Εντολών: Εν ολών: μεταβλητό ή σταθερό μέγεθος bytes για κάθε εντολή; (8086 1-17 bytes, MIPS 4 bytes) Πώς γίνεται η αποκωδικοποίηση (ID); Που βρίσκονται τα ορίσματα (operands) και το αποτέλεσμα: Μνήμη-καταχωρητές, πόσα ορίσματα, τι μεγέθους; Ποια είναι στη μνήμη και ποια όχι; Πόσοι κύκλοι για κάθε εντολή; cslab@ntua 2010-2011 2 Κατηγορίες Αρχιτεκτονικών Συνόλου Εντολών (ISA Classes) 1 Αρχιτεκτονικές Συσσωρευτή (accumulator architectures) 1. (μας θυμίζει κάτι?) 2 Α 2. Αρχιτεκτονικές έ επεκταμένου έ συσσωρευτή ή ή καταχωρητών ώ ειδικού σκοπού (extended accumulator ή special purpose register) 3. Αρχιτεκτονικές Καταχωρητών Γενικού Σκοπού 3α register 3α. register-memory memory 3b. register-register (RISC) 7/2/2011 cslab@ntua 2010-2011 3 Αρχιτεκτονικές Συσσωρευτή (1) 1η γενιά υπολογιστών: h/w ακριβό, μεγάλο μέγεθος καταχωρητή. Ένας καταχωρητής για όλες τις αριθμητικές εντολές (συσσώρευε όλες τις λειτουργίες → Συσσωρευτής (Accum) Σύνηθες: η ς 1ο όρισμα ρ μ είναι ο Αccum,, 2o η μ μνήμη, ήμη, αποτέλεσμα μ στον Accum π.χ. add 200 Παράδειγμα: A=B+C Accum = Memory(AddressB); Load AddressB Accum = Accum + Memory(AddressC); Add AddressC Memory(AddressA) = Accum; Store AddressA Όλες οι μεταβλητές Όλ βλ έ αποθηκεύονται θ ύ στη μνήμη. ή Δ υπάρχουν Δεν ά βοηθητικοί καταχωρητές 7/2/2011 cslab@ntua 2010-2011 4 Αρχιτεκτονικές Συσσωρευτή (2) Κατά: Χρειάζονται πολλές εντολές για ένα πρόγραμμα Κάθε φορά πήγαινε-φέρε από τη μνήμη (? Κακό είναι αυτό) Bottleneck o Accum! Υπέρ: Εύκολοι compilers, κατανοητός προγραμματισμός, εύκολη ύ λ σχεδίαση δί h/ h/w η; Πρόσθεση ρ η καταχωρητών χ ρη για γ συγκεκριμένες γ ρ μ ς λειτουργίες ργ ς Λύση; (ISAs καταχωρητών ειδικού σκοπού) 7/2/2011 cslab@ntua 2010-2011 5 Αρχιτεκτονικές Επεκταμένου Συσσωρευτή Καταχωρητές ειδικού σκοπού π.χ. δεικτοδότηση, αριθμητικές πράξεις Υπάρχουν εντολές που τα ορίσματα είναι όλα σε καταχωρητές Κατά βάση (π.χ. σε αριθμητικές εντολές) το ένα όρισμα στη μνήμη. ή 7/2/2011 cslab@ntua 2010-2011 6 Αρχιτεκτονικές Καταχωρητών γενικού σκοπού Register-memory g y Register register (load Register-register store) (1980+) Αφήνουν το ένα όρισμα να είναι στη μνήμη (πχ. 80386) Load R1, B Add dd R1, 1 C Store A, R1 Memory-memory 7/2/2011 A=B+C Load R1, B Load R2, C Add R3, R1, R2 Store A, R3 extended-accumulator accumulator register-register register-memory cslab@ntua 2010-2011 7 Αρχιτεκτονική Στοίβας Καθόλου registers! Stack model ~ 1960!!! Στοίβα Σ ίβ που μεταφέρονται έ τα ορίσματα ί που αρχικά ά βρίσκονται β ί στη μνήμη. Καθώς βγαίνουν γίνονται οι πράξεις και το αποτέλεσμα ξαναμπαίνει στη στοίβα. Θυμάστε τα HP calculators με reverse polish notation A B+C A=B+C push Address C push AddressB add pop AddressA 7/2/2011 cslab@ntua 2010-2011 8 Εντολές μεταβλητού μήκους: 1 17 bytes 1-17 b 80 86 80x86 1-54 bytes VAX, IBM Γιατί?? Ιnstruction Memory ακριβή, οικονομία χώρου!!!! Εμείς στο μάθημα: register-register ISA! (load- store) 1. 2. 3. 4. Οι καταχωρητές είναι γρηγορότεροι από τη μνήμη Μειώνεται η κίνηση με μνήμη Δυνατότητα να υποστηριχθεί θ σταθερό θ μήκος εντολών λ (τα ορίσματα είναι καταχωρητές, άρα ό αριθμός τους (πχ. 3 καταχωρητές) αταχωρητές) όχι δ/νσεις μνήμης 1-32 Compilers πιο δύσκολοι!!! 7/2/2011 cslab@ntua 2010-2011 9 Βασικές Αρχές Σχεδίασης (patterson-hennessy COD2e) 1. Η ομοιομορφία των λειτουργιών συμβάλλει στην απλότητα του υλικού (Simplicity favors Regularity) 2. Όσο μικρότερο τόσο ταχύτερο! (smaller is faster) 3. H καλή σχεδίαση απαιτεί σημαντικούς συμβιβασμούς (Good design demands good compromises) Γενικότητες? Θα τα δούμε στη συνέχεια...... 7/2/2011 cslab@ntua 2010-2011 10 MIPS σύνολο εντολών: Λέξεις των 32 bit (μνήμη οργανωμένη σε bytes, ακολουθεί το μοντέλο big Εndian) 32 καταχωρητές γενικού σκοπού - REGISTER FILE Θα μιλήσουμε για: εντολές αποθήκευσης στη μνήμη (lw, sw) Αριθμητικές εντολές (add, sub κλπ) Εντολές διακλάδωσης (branch instructions) Δεν αφήνουμε τις εντολές να έχουν μεταβλητό πλήθος ορισμάτων- π.χ. add a,b,c πάντα: a=b+c μη την η 1η η αρχή: ρχή H ομοιομορφία μ μ ρφ των λειτουργιών ργ Θυμηθείτε συμβάλλει στην απλότητα του h/w 7/2/2011 cslab@ntua 2010-2011 11 Σύνολο Εντολών Instruction Set • Λέξεις της γλώσσας του υπολογιστή Λέξεις της γλώσσας του υπολογιστή – εντολές • Γλώσσες των υπολογιστών – όμοιες • Στο μάθημα, σύνολο εντολών MIPS άθ ύ λ λώ S 7/2/2011 cslab@ntua 2010-2011 12 Αφού οι καταχωρητές είναι τόσο....«γρήγοροι» γιατί να μην μεγαλώσουμε το μέγεθος του register file? 2η αρχή: Όσο μικρότερο τόσο ταχύτερο! Αν το register i file fil πολύ λ μεγάλο, λ πιο πολύπλοκη λ λ η αποκωδικοποίηση, πιο μεγάλος ο κύκλος ρολογιού (φάση ID) άρα.....υπάρχει ρ ρχ tradeoff Μνήμη οργανωμένη σε bytes: (Κάθε byte και ξεχωριστή δνση) 230 λέξεις μνήμης των 32 bit (4 bytes) κάθε μια Memory [0] 32 bits Memory [4] 32 bits Memory [8] 32 bits Memory [12] 32 bits $s0, $s1,… καταχωρητές (μεταβλητές συνήθως) $t0, $t1,… καταχωρητές (προσωρινές τιμές) $zero ειδικός καταχωρητής περιέχει το 0 7/2/2011 cslab@ntua 2010-2011 13 Big Endian vs Little Endian Big Endian: H δνση του πιο σημαντικού byte (MSB) είναι και δνση της λέξης Little Endian: H δνση του λιγότερο σημαντικού byte (LSB) είναι και δνση της λέξης H λέξη αποθηκεύεται πάντα σε συνεχόμενες θέσεις: δνση, δνση+1, .., δνση+33 δνση LITTLE ENDIAN LITTLE_ENDIAN BIG_ENDIAN A[0] A[1] A[2] 7/2/2011 0 1 2 3 4 5 6 7 8 9 10 11 MSB 8 bits LSB MSB A[0] A[1] LSB MSB A[2] LSB cslab@ntua 2010-2011 0 1 2 3 4 5 6 7 8 9 10 11 LSB MSB LSB MSB LSB MSB 14 MIPS ISA (βασικές εντολές) Αριθμητικές εντολές add, sub: πάντα τρία ορίσματα - ποτέ δνση μνήμης! add $s1, $s2, $s3 # $s1 = $s2+$s3 sub $s1, $s2, $s3 # $s1 = $s2-$s3 Εντολές μεταφοράς δεδομένων (load-store): Εδώ έχουμε αναφορά στη μνήμη (πόσοι τρόποι? Θα το δούμε στη συνέχεια) l $s1 lw $s1, 100($s2) # $s1 = Memory(100+$s2) (load word) sw $s1, 100($s2) # Memory(100+$s2) = $s1(store word) 7/2/2011 cslab@ntua 2010-2011 15 Λειτουργίες υλικού υπολογιστών Αριθμητικές Πράξεις • add dd a, b b, c # a← b + c a← b + c • a = b + c + d + e; – add a, b, c – add a, a, d – add a, a, e 3 εντολές για το άθροισμα 4 μεταβλητών 7/2/2011 cslab@ntua 2010-2011 16 Λειτουργίες υλικού υπολογιστών Παράδειγμα: Κώδ Κώδικας σε C C a = b + c; d = a – e; Μετάφραση σε κώδικα MIPS add a a, b b, c sub d, a, e 7/2/2011 cslab@ntua 2010-2011 17 Λειτουργίες υλικού υπολογιστών Παράδειγμα: f = (g ( + h) – (i + j); j) Τι παράγει ο compiler? add t0, g, h # προσωρινή μεταβλητή t0 add t1, i, j # προσωρινή μεταβλητή t1 sub f, t0, t1 # το f περιέχει έ το t0 – t1 7/2/2011 cslab@ntua 2010-2011 18 Λειτουργίες υλικού υπολογιστών Κατηγορία ηγ ρ Εντολή ή Παράδειγμα ρ γμ add add a, b, c subtract sub a, b, c Σημασία ημ a=b+c Πάντα 3 τελεστέοι a=b-c Πάντα 3 τελεστέοι Αριθμητικές Αριθ η ικές Πράξεις 7/2/2011 cslab@ntua 2010-2011 Σχόλια χ 19 Τελεστέοι Υλικού Υπολογιστών f = (g + h) – (i + j); (f h i j) ανατίθενται (f,g,h,i,j) ίθ σε ($s0,$s1,$s2,$s3,$s4) ($ 0 $ 1 $ 2 $ 3 $ 4) $t0, $t1 προσωρινοί καταχωρητές add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1 7/2/2011 cslab@ntua 2010-2011 20 Τελεστέοι Υλικού Υπολογιστών Γλώσσες προγραμματισμού έχουν: • απλές λέ μεταβλητές βλ έ • σύνθετες δομές (π.χ. arrays, structs) Πώς τις αναπαριστά ένας υπολογιστής; Πάντα στη μνήμη Εντολές μεταφοράς δεδομένων 7/2/2011 cslab@ntua 2010-2011 21 Τελεστέοι Υλικού Υπολογιστών Εντολές μεταφοράς δεδομένων Π.χ. Διεύθυνση του 3 στοιχείου ί είναι ί 2 Τιμή στοιχείου Memory[2] είναι 10 7/2/2011 cslab@ntua 2010-2011 22 Τελεστέοι Υλικού Υπολογιστών Εντολή Ε λή μεταφοράς ά δδεδομένων δ έ από ό τη μνήμη ή load καταχωρητής, σταθερά(καταχωρητής) πχ π.χ. lw $t1, 4($s2) φορτώνουμε στον $t1 την τιμή M[$s2+4] 7/2/2011 cslab@ntua 2010-2011 23 Τελεστέοι Υλικού Υπολογιστών Παράδειγμα: Α πίνακας 100 λέξεων (4 bytes η λέξη) g, h ανατίθενται ίθ σε $s1, $ 1 $s2 $2 αρχική διεύθυνση του A στον $s3 Μεταγλωττίστε g = h + A[8]; offset base register g lw $t0, 32($s3) add $s1, $s2, $t0 7/2/2011 cslab@ntua 2010-2011 24 Τελεστέοι Υλικού Υπολογιστών • Μνήμη είναι byte addressable • Δύο διαδοχικές λέξεις δ έ διαφέρουν κατά ά4 • alignment restriction (ευθυγράμμιση) – λέξεις ξεκινάνε πάντα σε διεύθυνση πολ/σιο του 4 7/2/2011 cslab@ntua 2010-2011 25 Τελεστέοι Υλικού Υπολογιστών Σταθερές: Π ό θ Πρόσθεση της τιμής ή 4 στον $s3 $3 lw $t0, AddrConstant4($s1) add $s3, $s3, $t0 ή addi $s3, $s3, 4 Make common case FAST 7/2/2011 cslab@ntua 2010-2011 26 Τελεστέοι Υλικού Υπολογιστών Τελεστέοι Τ λ έ MIPS 32 καταχωρητές $s0, $s1, ... 230 θέσεις λέξεων στη μνήμη 232 θέσεις byte στη μνήμη 7/2/2011 cslab@ntua 2010-2011 27 Τελεστέοι Υλικού Υπολογιστών Συμβολική γλώσσα MIPS Π Παραδείγματα δ ί add dd $ $s1, 1 $ $s2, 2 $ $s3 3 sub $s1, $s2, $s3 addi $s1 $s1, $s2 $s2, 100 lw $s1, 100($s2) sw $s1,100($s2) , 7/2/2011 cslab@ntua 2010-2011 28 Τελεστέοι Υλικού Υπολογιστών Πό γρήγορα Πόσο ή πληθαίνουν λ θ ί οι καταχωρητές έ σε έναν επεξεργαστή; 1. Πολύ γρήγορα (Νόμος Moore, 2ος αριθμός τρανζίστορ/18 μήνες) 2. Πολύ αργά (portable binary code) Π.χ. χ Θ Θέλουμε μ τα προγράμματά ρ γρ μμ μας μ ς να τρέχουν ρ χ και στον Pentium III και στον Pentium IV 7/2/2011 cslab@ntua 2010-2011 29 Αναπαράσταση Εντολών στον Υπολογιστή Δυαδικά Δ δ ά ψηφία, ί Δυαδικό Δ δ ό σύστημα ύ (bi (binary)) Υλικό υπολογιστών, υψηλή-χαμηλή τάση, κλπ. Kαταχωρητές $s0, ..., $s7 αντιστοιχίζονται στους 16 ως 23 $ 0 ..., $$t7 $t0, 7 αντιστοιχίζονται ίζ στους 8 ως 15 7/2/2011 cslab@ntua 2010-2011 30 Αναπαράσταση Εντολών στον Υπολογιστή Συμβολική αναπαράσταση: add $t0 $t0, $s1 $s1, $s2 Assembly Πώς την καταλαβαίνει ο MIPS? $s1 0 17 $s2 18 $t0 8 add unused 0 32 Κώδικας μηχανής 000000 10001 10010 01000 00000 10000 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit 7/2/2011 cslab@ntua 2010-2011 31 Μορφή Εντολής - Instruction Format Θυμηθείτε το 1ο κανόνα: Η ομοιομορφία των λειτουργιών συμβάλλει στην απλότητα του υλικού R-Type (register type) op rs rt rd shamt funct 6 bits 5bits 5bits 5bits 5bits 6bits Op: opcode rs,rt: register source operands Rd: register destination operand Shamt: shift amount F Funct: t op specific ifi (function (f ti code) d ) add dd $ $rd, d $ $rs, $ $rt t 7/2/2011 cslab@ntua 2010-2011 32 MIPS R‐Type (ALU) R-Type: Όλες οι εντολές της ALU που χρησιμοποιούν 3 καταχωρητές OP 6 bits rs 5 bits rt 5 bits rd shamt funct 5 bits 5 bits 6 bits • Παραδείγματα : – add $1 $1,$2,$3 $2 $3 and $1 $1,$2,$3 $2 $3 – sub $1,$2,$3 or $1,$2,$3 Destination register in rd Operand register in rt Operand register in rs 7/2/2011 cslab@ntua 2010-2011 33 Αναπαράσταση Εντολών στον Υπολογιστή op rs rt rd shamt funct 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit Τι γίνεται με τη load? Πώς χωράνε οι τελεστές της στα παραπάνω πεδία? Π.χ. η σταθερά της lw. lw $ $t1, , 8000($s3) ($ ) σε ποιο πεδίο χωράει; 7/2/2011 cslab@ntua 2010-2011 34 Ερώτηση: Μας αρκεί το R-Type? Τι γίνεται Τ ί με εντολές λέ που θέλ θέλουν ορίσματα ί διευθύνσεις δ θύ ή σταθερές? Θυμηθείτε, θέλουμε σταθερό μέγεθος κάθε εντολής ής ((32 bit)) Απάντηση: Μάλλον όχι Άρα: H καλή σχεδίαση απαιτεί σημαντικούς συμβιβασμούς (3η αρχή) Ι-Type: op p rs rt address_offset 6 bits 5 bits 5 bits 16 bits lw $rt, address_offset($rs) _ Τα 3 πρώτα ρ πεδία ((op,rs, p, , rt)) έχουν χ το ίδιο όνομα μ και μέγεθος μ γ ς όπως και πριν 7/2/2011 cslab@ntua 2010-2011 35 Αναπαράσταση Εντολών στον Υπολογιστή Παράδειγμα: Kαταχωρητές χ ρη ς ((σκονάκι ☺)) $s0, ..., $s7 αντιστοιχίζονται στους 16 ως 23 $t0 ..., $t7 αντιστοιχίζονται στους 8 ως $t0, 15 lw $t0 $t0, 32($s3) I format I-format 7/2/2011 op rs rt σταθερά ή διεύθυνση 6 bit 5 bit 5 bit 16 bit xxxxxx 19 8 32 cslab@ntua 2010-2011 36 Επεξεργαστής Αριθμός καταχωρητών γενικού σκοπού Αρχιτεκτονική Έτος EDSAC 1 accumulator 1949 IBM 701 1 accumulator 1953 CDC 6600 8 load-store 1963 IBM 360 16 register-memory 1964 DEC PDP-8 1 accumulator 1965 DEC PDP-11 8 Register-memory 1970 Intel 8008 1 accumulator 1972 Motorola 6800 2 accumulator 1974 DEC VAX 16 register-memory, memory-memory 1977 I t l 8086 Intel 8 extended t d d accumulator l t 1978 Motorola 68000 16 register-memory 1980 Intel 80386 8 register-memory 1985 MIPS 32 l d load-store 1985 HP PA-RISC 32 load-store 1986 SPARC 32 load-store 1987 PowerPC 32 load-store 1992 DEC Alpha 32 load-store 1992 7/2/2011 cslab@ntua 2010-2011 37 Κανόνες Ονοματοδοσίας και Χρήση των MIPS Registers • Εκτός από το συνήθη συμβολισμό των καταχωρητών με $ ακολουθούμενο από τον αριθμό του καταχωρητή, μπορούν επίσης να παρασταθούν και ως ή εξής : Αρ. Καταχωρητή 7/2/2011 Όνομα 0 1 23 2-3 $zero $at $ 0$ 1 $v0-$v1 4-7 8-15 16-23 24-25 26-27 28 29 30 31 $a0-$a3 $t0-$t7 $s0-$s7 $t8-$t9 $k0-$k1 $ $ $gp $sp $fp $ra Χρήση Preserved on call? Constant value 0 Reserved for assembler Vl Values ffor result l andd expression evaluation Arguments Temporaries Saved More temporaries Reserved for operating p g system y Global pointer Stack pointer Frame pointer Return address cslab@ntua 2010-2011 n.a. όχι ό όχι ναι όχι ναι όχι ναι ναι ναι ναι ναι 38 MIPS I‐Type : Load/Store OP rs rt 6 bits 5 bits 5 bits address 16 bits – address: 16‐bit memory address offset in bytes added to base register. • Παραδείγματα : base register in rs Offset – Store word: sw source register in rt 500($4), $3 – Load word: lw $1, 30($2) Destination register in rt 7/2/2011 Offset cslab@ntua 2010-2011 base register in rs 39 MIPS ALU I‐Type Οι I-Type εντολές της ALU χρησιμοποιούν 2 καταχωρητές και μία σταθερή τιμή I-Type είναι και οι εντολές Loads/stores, conditional branches. OP rs rt 6 bits 5 bits 5 bits immediate 16 bits – immediate: Constant second operand for ALU instruction. • Παραδείγματα : Παραδείγματα : – add immediate: addi $1,$2,100 – and immediate andi $1,$2,10 Constant operand R lt register Result i t in i rtt i immediate in i di t Source operand register in rs 7/2/2011 cslab@ntua 2010-2011 40 MIPS data transfer instructions Παραδείγματα Instruction sw 500($4), $3 sh 502($2), $3 sb 41($3), $2 Σχόλια Store word Store half Store byte lw $1, 30($2) $1 30($2) lh $1, 40($3) lhu $1, 40($3) lb $1, 40($3) lbu $1, 40($3) Load word Load word Load halfword Load halfword unsigned Load byte Load byte unsigned lui $1, 40 Load Upper Immediate (16 bits shifted left by 16) LUI R5 7/2/2011 cslab@ntua 2010-2011 R5 0000 … 0000 41 How about larger constants? • We'd like to be able to load a 32 bit constant into a register • Must use two instructions; new "load load upper immediate immediate" instruction lui $t0, 1010101010101010 filled with zeros 1010101010101010 0000000000000000 Th must get the Then h lower l order d bits bi right, i h i.e., i ori $t0, $t0, 1010101010101010 ori 7/2/2011 1010101010101010 0000000000000000 0000000000000000 1010101010101010 1010101010101010 1010101010101010 cslab@ntua 2010-2011 42 Topics to Review • Memory layout • Text, data (static and heap), and the stack • Procedure conventions d • Procedure call bookkeeping • Caller Saved Registers: g • • • • Return address Arguments Return value $t Registers $t Registers $ra $a0, $a1, $a2, $a3 $v0, $v1 $t0 $t9 $t0 ‐ • Callee Saved Registers: • $s Registers $s0 ‐ $s7 • Procedure structure Procedure structure • Prologue: • Body: • Epilogue: 7/2/2011 allocate frame, save registers, assign locals procedure code restore registers free frame restore registers, free frame cslab@ntua 2010-2011 43 Overview • Data types – Application / HLL requirements A li ti / HLL i t – Hardware support (data and instructions) • MIPS data types MIPS data types • Support for bytes and strings • Addressing Modes Add i M d – Data – Instructions • Large constants and far target addresses • SPIM code SPIM code 7/2/2011 cslab@ntua 2010-2011 44 Data Types • Applications / HLL • Hardware support – Numeric data types yp – Integer – Floating point Character – String – Date – Currency – Text, – Objects (ADT) – Blob – double precision – Signed, unsigned g , g 7/2/2011 – Integers – 8 / 16 / 32 / 64 bits – Signed or unsigned – Binary coded decimal (COBOL, Y2K!) • Floating point • 32 / 64 /128 bits bi – Nonnumeric data types • • • • cslab@ntua 2010-2011 Characters Strings Boolean (bit maps) Pointers 45 MIPS Data Types (1/2) • Basic machine data type: 32‐bit word – 0100 0011 0100 0011 0100 1001 0100 1001 0101 0011 0100 0101 0101 0011 0100 0101 – Integers (signed or unsigned) • 1,128,878,917 – Floating point numbers • 201.32421875 – 4 ASCII characters 4 ASCII h • C I S E – Memory addresses (pointers) Memory addresses (pointers) • 0x43495345 – Instructions 7/2/2011 cslab@ntua 2010-2011 46 MIPS Data Types (2/2) • 16‐bit constants (immediates) – addi $s0, $s1, 0x8020 ddi $ 0 $ 1 0 8020 – lw $t0, 20($s0) • Half word (16 bits) – lh (lhu): load half word lh $t0, 20($s0) – sh: save half word sh $t0, 20($s0) • Byte (8 bits) y ( ) – lb (lbu): load byte – sb: save byte sb: save byte 7/2/2011 cslab@ntua 2010-2011 sh $t0, 20($s0) sh $t0, 20($s0) sh $t0, 20($s0) 47 Byte Instructions lb $s1, 4($s0) Address Memory Bytes 0x10000000 $s0: 0x10000000 $ : 0xFFFFFFAA $s1 lbu $s1, 2($s0) 10101010 $s0: 0x10000000 $s1: 0x000000 AA 7/2/2011 cslab@ntua 2010-2011 48 String Manipulation Void strcpy (char[], char y[]) { int i; i = 0; while ((x[i]=y[i]) != 0) i = i + 1; } C convention: Null byte (00000000) represents end of the string Importance of comments in MIPS! 7/2/2011 strcpy: subi $sp, $sp, 4 sw $s0, 0($sp) add $s0, $zero, $zero L1: add $t1,, $a1,, $s0 lb $t2, 0($t1) add $t3, $a0, $s0 sb $t2, $t2 0($t3) beq $t2, $zero, L2 addi $s0, $s0, 1 j L1 L2: lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra cslab@ntua 2010-2011 49 Constants • Small Small constants are used frequently (50% of constants are used frequently (50% of operands) – e.g., g, A = A + 5;; • Solutions – Put 'typical constants' in memory and load them. – Create hard‐wired registers (like $zero) for constants like 1. • MIPS Instructions: slti $8, $8 $18 $18, 10 andi $29, $29, 6 ori $29, $29, 0x4a addi $29, $29, 4 7/2/2011 8 29 29 4 101011 10011 01000 0000 0000 0011 0100 cslab@ntua 2010-2011 50 Large Constants To load a 32 bit constant into a register: • 1. Load (16) higher order bits lui $t0, 1010101010101010 1010 1010 1010 1010 0000 0000 0000 0000 2. Then must get the lower order bits right, i.e., ori i $t0, $t0 $t0 $t0, 1010101010101010 $t0: ori 1010 1010 1010 1010 0000 0000 0000 0000 0000 0000 0000 0000 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 1010 7/2/2011 cslab@ntua 2010-2011 51 Addressing Modes • Addresses for data and instructions Data (operands and results) • Data (operands and results) – Registers – Memory locations y – Constants • Efficient encoding of addresses (space: 32 bits) g (p ) – – – – Registers (32) => 5 bits to encode address Destructive instructions: reg2 = reg2 + reg1 Accumulator Stack • Orthogonality of opcodes and addressing modes 7/2/2011 cslab@ntua 2010-2011 52 Data Addressing Modes • Register addressing – The most common (fastest and shortest) The most common (fastest and shortest) – add $3, $2, $1 • Base addressing B dd i – Operand is at a memory location with offset – lw $t0, 20 ($t1) • Immediate addressing – Operand is a small constant within the instruction – addi $t0, $t1, 4 , , ((signed 16‐bit integer) g g ) 7/2/2011 cslab@ntua 2010-2011 53 Addressing 1. Immediate addressing op rs rt Immediate 2. Register addressing op rs rt rd ... funct Registers Register 3. Base addressing op rs rt Memory Address + Register 4. PC-relative addressing op rs rt Byte Halfword Word Address *4 PC Memory + Word 5. Pseudodirect addressing op Address *4 Memory Word PC 7/2/2011 cslab@ntua 2010-2011 54 Instruction Addressing Modes • Addresses are 32 bits long • Special purpose register PC S i l i t PC ((program counter) t ) stores the address of the current instruction • PC‐relative addressing (branches) – Address: PC + (constant in the instruction) * 4 – beq $t0, $t1, 20 (0x15090005) • Pseudodirect addressing (jumps) g (j p ) – Address: PC[31:28] : (constant in the instruction) * 4 7/2/2011 cslab@ntua 2010-2011 55 MIPS PC SPIM Code machine code Pseudo MIPS main [0x00400020] add $9, $10, $11 (0x014b4820) [[0x00400024]] j ((0x08100012)) [0x00400028] addi $9, $10, -50 [0x0040002c] lw $8, 5($9) (0x8d280005) lw $t0, 5($t1) [0x00400030] lw $8, -5($9) (0x8d28fffb) lw $t0, -5($t1) [0x00400034] bne $8, $9, 20 [exit-PC] (0x15090005) bne $t0, $t1, exit [0x00400038] addi $9, $10, 50 (0x21490032) addi $t1, $t2, 50 [0x0040003c] bne $8, $9, -28 [main-PC] (0x1509fff9) bne $t0, $t1, main [0x00400040] lb $8, -5($9) (0x8128fffb) lb $t0, -5($t1) [0x00400044] j 0x00400020 [main] j main [0x00400048] exit 7/2/2011 0x00400048 [[exit]] add dd $9 $9, $10 $10, $11 (0x2149ffce) (0x08100008) (0 014b4820) (0x014b4820) cslab@ntua 2010-2011 main: add $t1, $t2, $t3 j exit addi $t1, $t2, -50 exit: i add dd $$t1, 1 $$t2, 2 $$t3 3 56 Far Target Address Text Segment (252MB) 0x00400000 (0x07fe0000) -217 PC (0x08000000) beq $s0, $s1, L1 +217 (0x08020000) bne $s0, $s1, L2 j L1 (0x08200000) L1: L2: 0x10000000 7/2/2011 cslab@ntua 2010-2011 57 Overview • • • • • • 7/2/2011 Pointers (addresses) and values Argument passing Storage lifetime and scope Pointer arithmetic Pointers and arrays Pointers in MIPS cslab@ntua 2010-2011 58 Pointers • Pointer: a variable that contains the address of another variable – HLL version of machine language memory address • Why use Pointers? – Sometimes only way to express computation – Often more compact and efficient code • Why not? – Huge source of bugs in real software, perhaps the largest single source 1) Dangling reference (premature free) 2) Memory leaks (tardy free): can't have long-running jobs without periodic restart of them 7/2/2011 cslab@ntua 2010-2011 59 C Pointer Operators • Suppose c has h value l 100, it i is i located l d in i memory at address 0x10000000 • Unary U operator t & gives i address: dd p = &c; gives address of c to p; – p “points points to to” c (p == 0x10000000) • Unary operator * gives value that pointer points to – if p = &c => * p == 100 (Dereferencing a pointer) • Deferencing ⇒ data transfer in assembler – ... = ... *p p ...; ; ⇒ load (get value from location pointed to by p) – *p = ...; ⇒ store (put value into location pointed to by p) 7/2/2011 cslab@ntua 2010-2011 60 Pointer Arithmetic int x = 1, y = 2; int z[10]; int *p; /* x and y are integer variables */ /* an array of 10 ints, z points to start */ /* p is a pointer to an int */ x = 21; z[0] = 2; z[1] = 3 p = &z[0]; p = z; p = p+1; p++; *p = 4; p = 3; p = &x; z = &y /* assigns x the new value 21 */ /* assigns 2 to the first, 3 to the next */ /* p refers to the first element of z */ /* same thing; g p[ i ] == z[[ i ]]*/ /* now it points to the next element, z[1] */ /* now it points to the one after that, z[2] */ /* assigns 4 to there there, z[2] == 4*/ /* bad idea! Absolute address!!! */ /* p points to x, *p == 21 */ illegal!!!!! array name is not a variable 7/2/2011 cslab@ntua 2010-2011 p: z[1] [ ] z[0] 4 3 2 y: 2 x: 21 61 Assembly Code c is int, has value 100, in memory at address 0x10000000 p in $a0, 0x10000000, $a0 x in $s0 1 p = &c; 1. /* p gets 0x10000000*/ lui $a0,0x1000 # p = 0x10000000 2 x = *p; 2. lw /* x gets 100 */ $s0, 0($a0) # dereferencing p 3 *p 3. p = 200; /* / c gets 200 */ / addi $t0,$0,200 sw $t0, 0($a0) # dereferencing p 7/2/2011 cslab@ntua 2010-2011 62 Example int strlen(char *s) { p = s; /* p p points to chars */ char *p while (*p != ’\0’) p++; /* points to next char */ return p - s; /* end - start */ / / } mov $t0,$a0 lbu $t1,0($t0) $ 0 $ 0 / /* derefence p */ / beq $t1,$zero, Exit Loop:addi $t0,$t0,1 /* p++ */ lbu $t1,0($t0) /* derefence p */ bne $t1,$zero, Loop Exit:sub $v0,$t0,$a0 jr $ra 7/2/2011 cslab@ntua 2010-2011 63 Argument Passing Options • 2 choices – “Call Call by Value Value”:: pass a copy of the item to the function/procedure – “Call byy Reference”: ppass a ppointer to the item to the function/procedure • Single word variables passed by value • Passing an array? e.g., a[100] – Pascal (call by value) copies 100 words of a[] onto the stack – C (call by reference) passes a pointer (1 word) to the array a[] in a register 7/2/2011 cslab@ntua 2010-2011 64 Lifetime of Storage and Scope • Automatic (stack allocated) –T Typical i l local l l variables i bl off a function f ti – Created upon call, released upon return – Scope S iis th the function f ti • Heap allocated Code Static Heap – Created C t d upon malloc, ll released l d upon free f – Referenced via pointers • External E t l / static t ti – Exist for entire program 7/2/2011 cslab@ntua 2010-2011 Stack 65 Arrays, Pointers, and Functions • 4 versions of array function that adds two arrays and puts sum in a third array (sumarray) 1. Third array is passed to function 2 Using 2. U i a local l l array (on ( stack) t k) for f result lt andd passing i a pointer to it 3 Third array is allocated on heap 3. 4. Third array is declared static • 7/2/2011 Purpose off example P l is i to t show h interaction i t ti off C statements, pointers, and memory allocation cslab@ntua 2010-2011 66 Version 1 int x[100], y[100], z[100]; sumarray(x y, sumarray(x, y z); • C calling convention means: sumarray(&x[0], (& [0] &y[0], & [0] & &z[0]); [0]) • Really passing pointers to arrays addi addi addi jal 7/2/2011 $a0,$gp,0 # x[0] starts at $gp $a1,$gp,400 # y[0] above x[100] $a2,$gp,800 # z[0] above y[100] sumarray cslab@ntua 2010-2011 67 Version1: Compiled Code void sumarray(int a[], int b[], int c[]) { int i; for(i = 0; i < 100; i = i + 1) c[i] = a[i] + b[i]; } Loop: Exit: 7/2/2011 addi beq lw lw add sw addi addi addi j jr $t0,$a0,400 $a0,$t0,Exit $t1 0($a0) $t1, $t2, 0($a1) $t1,$t1,$t2 $t1,, 0($a2) $ ($ ) $a0,$a0,4 $a1,$a1,4 $a2,$a2,4 Loop $ra # beyond end of a[] # $t1 $t1=a[i] a[i] # $t2=b[i] # $t1=a[i] + b[i] # c[i]=a[i] [ ] [ ] + b[i] [] # $a0++ # $a1++ # $a2++ cslab@ntua 2010-2011 68 Version 2 int *sumarray(int a[],int b[]) { int i, c[100]; for(i=0;i<100;i=i+1) c[i] = a[i] + b[i]; return c; } $sp c[100] a[100] [ ] B[100] 7/2/2011 addi addi addi addi Loop: beq lw lw add s sw addi addi addi ddi j Exit: addi j jr cslab@ntua 2010-2011 $t0,$a0,400 # beyond end of a[] $sp,$sp,-400 # space for c $t3 $sp 0 $t3,$sp,0 # ptr for c $v0,$t3,0 # $v0 = &c[0] $a0,$t0,Exit $t1 0($a0) # $t1=a[i] $t1, $t2, 0($a1) # $t2=b[i] $t1,$t1,$t2 # $t1=a[i] + b[i] $t1 0($t3) # c[i] $t1, c[i]=a[i] a[i] + b[i] $a0,$a0,4 # $a0++ $a1,$a1,4 # $a1++ $t3 $t3 4 $t3,$t3,4 # $t3++ Loop $sp,$sp, 400 # pop stack $ $ra 69 Version 3 int * sumarray(int a[],int b[]) { int i; int *c; c = (int *) malloc(100); for(i=0;i<100;i=i+1) c[i] = a[i] + b[i]; return c; } Code Static c[100] Heap • Not reused unless freed –C Can lead l d to memory leaks l k – Java, Scheme have garbage collectors ll t to t reclaim l i free f space 7/2/2011 cslab@ntua 2010-2011 Stack 70 Version 3: Compiled Code addi $t0,$a0,400 # beyond end of a[] addi $sp $sp,$sp, $sp -12 12 # space for regs sw $ra, 0($sp) # save $ra sw $a0, 4($sp) # save 1st arg. sw $a1, $ , 8($sp) ($ p) # save 2nd arg. g addi $a0,$zero,400 jal malloc addi $t3,$v0,0 # ptr for c lw $a0, 4($sp) # restore 1st arg. lw $a1, 8($sp) # restore 2nd arg. Loop: beq $a0,$t0,Exit ... (loop (l as before b f on prior i slide lid ) j Loop Exit:lw $ra, 0($sp) # restore $ra addi $sp $sp, $sp $sp, 12 # pop stack jr $ra 7/2/2011 cslab@ntua 2010-2011 71 Version 4 int * sumarray(int a[],int b[]) { int i; static int c[100]; [ ] for(i=0;i<100;i=i+1) c[i] = a[i] + b[i]; return c; } Code Static c[100] Heap • Compiler allocates once for function, space is reused – Will be b changed h d nextt time ti sumarray invoked – Why describe? used in C libraries 7/2/2011 cslab@ntua 2010-2011 Stack 72 Review 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 alw ays 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 230 memory Memory[4], Memor [4] ..., words 7/2/2011 Memory[4294967292] sequential ti l w ords d diff differ bby 44. MMemory hholds ld ddatat structures, t t suchh as arrays, and spilled registers, such as those saved on procedure calls. cslab@ntua 2010-2011 73 Review MIPS assembly language Category Arithmetic Instruction add Example add $s1, $s2, $s3 Meaning $s1 = $s2 + $s3 Three operands; data in registers subtract sub $s1, $s2, $s3 $s1 = $s2 - $s3 Three operands; data in registers $s1 = $s2 + 100 $s1 = Memory[$s2 + 100] Memory[$s2 + 100] = $s1 $s1 = Memory[$s2 + 100] Memory[$s2 + 100] = $s1 Used to add constants addi $s1, $s2, 100 lw $s1, 100($s2) load word sw $s1, 100($s2) store word lb $s1, 100($s2) load byte sb $s1, 100($s2) store byte load upper immediate lui $s1, 100 add immediate Data transfer Conditional branch Unconditional jump 7/2/2011 $s1 = 100 * 2 16 Comments Word from memory to register Word from register to memory Byte from memory to register Byte from register to memory Loads constant in upper 16 bits branch on equal beq $s1, $s2, 25 if ($s1 == $s2) go to PC + 4 + 100 Equal test; PC-relative branch branch on not equal bne $s1, $s2, 25 if ($s1 != $s2) go to PC + 4 + 100 Not equal test; PC-relative set on less than slt $s1, $s2, $s3 if ($s2 < $s3) $s1 = 1; else $s1 = 0 Compare less than; for beq, bne set less than immediate slti jump j jr jal jjump p register g jump and link $s1, $s2, 100 if ($s2 < 100) $s1 = 1; Compare less than constant else $s1 = 0 2500 $ra 2500 Jump to target address go to 10000 $ra For switch, p procedure return go to g $ra = PC + 4; go to 10000 For procedure call cslab@ntua 2010-2011 74 Conclusions • Data can be anything – Datatyping restricts data representations – Applications restrict datatyping • MIPS Datatypes: Number, String, Boolean • Addressing: Pointers, Values – Many addressing modes (direct, indirect,…) y g ( , , ) – Memory‐based address storage (jr instruction) • Arrays: big chunks of memory – Pointers versus stack storage – Be careful of memory leaks! 7/2/2011 cslab@ntua 2010-2011 75 Αναπαράσταση Εντολών στον Υπολογιστή εντολή μορφή add R 0 reg reg reg 0 32ten δ.ε. sub R 0 reg reg reg 0 34ten δ.ε. addi ddi I 8ten reg reg δ δ.ε. δ δ.ε. δ δ.ε. σταθ. θ lw I 35ten reg reg δ.ε. δ.ε. δ.ε. διευθ. sw I 43ten reg reg δ.ε. δ.ε. δ.ε. διευθ. 7/2/2011 op rs rt rd cslab@ntua 2010-2011 shamt funct address 76 Αναπαράσταση Εντολών στον Υπολογιστή Παράδειγμα: $t1 $t1 περιέχει base address πίνακα Α (32 bit/στοιχείο Α[i]) έ b dd ί Α (32 bit/ ί Α[i]) $s2 αντιστοιχίζεται στη μεταβλητή h Μεταγλωττίστε το A[300] = h + A[300]; Μεταγλωττίστε το A[300] = h + A[300]; lw $t0, 1200($t1) add $t0, $s2, $t0 sw $t0, 1200($t1) 7/2/2011 cslab@ntua 2010-2011 77 Αναπαράσταση Εντολών στον Υπολογιστή Παράδειγμα (συνέχεια): lw $t0, 1200($t1) add $t0, $s2, $t0 sw $t0, 1200($t1) Κώδ Κώδικας Μηχανής? Μ ή ? op 35 0 43 7/2/2011 rs 9 18 9 rt 8 8 8 rd 8 cslab@ntua 2010-2011 shamt 1200 0 1200 funct 32 78 Αναπαράσταση Εντολών στον Υπολογιστή Παράδειγμα (συνέχεια): op 35 0 43 rs 9 18 9 rt 8 8 8 op 100011 000000 101011 rs 01001 10010 01001 rt 01000 01000 01000 7/2/2011 rd 8 shamt 1200 0 1200 funct 32 rd shamt funct 0000 0100 1011 0000 8 0 32 0000 0100 1011 0000 cslab@ntua 2010-2011 79 Αναπαράσταση Εντολών στον Υπολογιστή Έννοια αποθηκευμένου προγράμματος Ο υπολογιστής κάνει πολλές Ο υπολογιστής κάνει πολλές εργασίες φορτώνοντας δεδομένα στο μνήμη. δεδομένα στο μνήμη. Δεδομένα και εντολές είναι στοιχεία στη μνήμη. χ η μ ήμη Π.χ. compilers μεταφράζουν στοιχεία σε κάποια άλλα χ στοιχεία. 7/2/2011 cslab@ntua 2010-2011 80 Λογικές Λειτουργίες (Πράξεις) Λογικές Λειτουργίες Τελεστές C Εντολές MIPS << Sll (shift left logical) Shift right >> Srl (shift right logical) AND & and, andi OR | or, ori i NOT ~ nor Shift left 7/2/2011 cslab@ntua 2010-2011 81 Λογικές Λειτουργίες (Πράξεις) SHIFT $s0: 0000 0000 0000 0000 0000 0000 0000 1001 = 9ten ☺ $ sll $t2, $s0, 4 Κάνουμε shift αριστερά το περιεχόμενο του $s0 κατά 4 θέσεις 0000 0000 0000 0000 0000 0000 1001 0000 = 144ten και τοποθετούμε το αποτέλεσμα στον $t2. !!Το περιεχόμενο του $s0 μένει αμετάβλητο!! 7/2/2011 cslab@ntua 2010-2011 82 Λογικές Λειτουργίες (Πράξεις) SHIFT Kαταχωρητές (σκονάκι ☺) $s0, ..., $s7 αντιστοιχίζονται στους 16 ως 23 $t0, ..., $t7 αντιστοιχίζονται στους 8 ως 15 sll $ $t2, , $ $s0, , 4 6 bit 5 bit 5 bit 5 bit 5 bit 6 bit op 0 000000 rs 0 00000 rt 16 10000 rd 10 01010 shamt 4 00100 funct 0 000000 sll: opcode=0 opcode 0, funct=0 funct 0 7/2/2011 cslab@ntua 2010-2011 83 Λογικές Λειτουργίες (Πράξεις) AND, OR $ 0000 0000 0000 0000 0000 1101 0000 0000 $t2: $t1: 0000 0000 0000 0000 0011 1100 0000 0000 and $t0, $t1, $t2 # Μάσκα $t0: 0000 0000 0000 0000 0000 1100 0000 0000 or $t0, , $t1, , $t2 $t0: 0000 0000 0000 0000 0011 1101 0000 0000 7/2/2011 cslab@ntua 2010-2011 84 Λογικές Λειτουργίες (Πράξεις) NOT NOR NOT, $t1: 0000 0000 0000 0000 0011 1100 0000 0000 $t3: 0000 0000 0000 0000 0000 0000 0000 0000 δεν υπάρχει γιατί θέλουμε πάντα 2 καταχωρητές source. Άρα χρησιμοποιούμε τη nor: A NOR 0 = NOT (A OR 0) = NOT A not $t0, $t1 nor $t0, $t1, $t3 $t0: 1111 1111 1111 1111 1100 0011 1111 1111 7/2/2011 cslab@ntua 2010-2011 85 MIPS Arithmetic Instructions Παραδείγματα Instruction Παράδειγμα add add add $1,$2,$3 add $1,$2,$3 subtract sub $1,$2,$3 add immediate addi $1,$2,100 add unsigned addu $1,$2,$3 subtract unsigned bt t i d subu $1,$2,$3 b $1 $2 $3 add imm. unsign. addiu $1,$2,100 multiply mult $2,$3 multiply unsigned py g multu$2,$3 , divide div $2,$3 divide unsigned divu $2,$3 Move from Hi Move from Lo mfhi $1 mflo $1 7/2/2011 Έννοια Σχόλια $1 = $2 $1 $2 + $3 $3 3 operands; exception possible 3 operands; exception possible $1 = $2 – $3 3 operands; exception possible $1 = $2 + 100 + constant; exception possible $1 = $2 + $3 3 operands; no exceptions $1 $2 $3 $1 = $2 – 3 3 operands; no exceptions d ti $1 = $2 + 100 + constant; no exceptions Hi, Lo = $2 x $3 64‐bit signed product Hi, Lo = $2 x $3 , 64‐bit unsigned product g p Lo = $2 ÷ $3, Lo = quotient, Hi = remainder Hi = $2 mod $3 Lo = $2 ÷ $3, Unsigned quotient & remainder Hi = $2 mod $3 Hi = $2 mod $3 $1 = Hi Used to get copy of Hi $1 = Lo Used to get copy of Lo cslab@ntua 2010-2011 86 MIPS Logic/Shift Instructions Παραδείγματα Instruction and or xor nor and immediate or immediate xor immediate shift left logical shift right logical shift right arithm. hift i ht ith shift left logical shift right logical shift right arithm shift right arithm. 7/2/2011 Παράδειγμα and $1,$2,$3 or $1,$2,$3 xor $1,$2,$3 $ ,$ ,$ nor $1,$2,$3 andi $1,$2,10 ori $1,$2,10 xori $1, $2,10 sll $1,$2,10 srl $1,$2,10 sra $1,$2,10 $1 $2 10 sllv $1,$2,$3 srlv $1,$2, $3 srav $1 $2 $3 srav $1,$2, $3 Έννοια $1 = $2 & $3 $1 = $2 | $3 $1 = $2 ⊕ $ $ $3 $ $1 = ~($2 |$3) $1 = $2 & 10 $1 = $2 | 10 $1 = ~$2 &~10 $1 = $2 << 10 $1 = $2 >> 10 $1 $2 10 $1 = $2 >> 10 $1 = $2 << $3 $1 = $2 >> $3 $1 = $2 >> $3 $1 = $2 >> $3 cslab@ntua 2010-2011 Σχόλια 3 reg. operands; Logical AND 3 reg. operands; Logical OR 3 reg. operands; Logical XOR g p ; g 3 reg. operands; Logical NOR Logical AND reg, constant Logical OR reg, constant Logical XOR reg, constant Shift left by constant Shift right by constant Shift i ht ( i Shift right (sign extend) t d) Shift left by variable Shift right by variable Shift right arith by variable Shift right arith. by variable 87 Εντολές Λήψης Αποφάσεων beq, bne beq q reg1, g , reg2, g , L1 #branch if equal q Αν οι καταχωρητές reg1 και reg2 είναι ίσοι, πήγαινε στην ετικέτα L1 bne reg1 reg1, reg2 reg2, L1 #branch if not equal Αν οι καταχωρητές reg1 και reg2 δεν είναι ίσοι, πήγαινε ή στην ετικέτα έ L1 7/2/2011 cslab@ntua 2010-2011 88 Εντολές Λήψης Αποφάσεων Παράδειγμα: Π άδ if(i == j) f = g + h; else f = g – h; με f, g, h, i, j αντιστοιχούνται σε $s0, ..., $s4 version 1 version 2 bne $ $s3, , $ $s4, , Else beq q $s3, $ , $ $s4, , Then add $s0, $s1, $s2 sub $s0, $s1, $s2 j Exit j Exit Else:sub $s0, $s1, $s2 Then: add $s0, $s1, $s2 Exit: 7/2/2011 Exit: cslab@ntua 2010-2011 89 Εντολές Λήψης Αποφάσεων Βρόχοι (Loops) whilee (save[i] w (s ve[ ] == k)) i += 1;; με i = $s3, k = $s5, save base addr = $s6 Loop: sll add lw bne addi j $t1, $t1, $t0, $t0, $s3, Loop $s3, 2 #πολ/ζω i επί 4 $t1, $s6 0($t1) $s5, Exit $s3, 1 E it Exit: 7/2/2011 cslab@ntua 2010-2011 90 Εντολές Λήψης Αποφάσεων Συγκρίσεις slt $t0, $s3, $s4 # set on less than Ο καταχωρητής $t0 τίθεται με 1 αν η τιμή στον $s3 είναι μικρότερη από την τιμή στο $s4. Σταθερές ρ ς ωςς τελεστέοι είναι δημοφιλείς ημ φ ς στιςς συγκρίσεις γ ρ ς slti $t0, $s2, 10 # set on less than # i immediate di Ο καταχωρητής $t0 τίθεται με 1 αν η τιμή στον $s2 είναι μικρότερη από την τιμή 10. 10 7/2/2011 cslab@ntua 2010-2011 91 MIPS Branch, Compare, Jump Παραδείγματα Instruction branch on equal Παράδειγμα Έννοια beq $1,$2,100 if ($1 == $2) go to PC+4+100 Equal test; PC relative branch q branch on not eq. bne $1,$2,100 if ($1!= $2) go to PC+4+100 Not equal test; PC relative branch set on less than slt $1,$2,$3 if ($2 < $3) $1=1; else $1=0 p ; p Compare less than; 2’s comp. set less than imm. slti $1,$2,100 if ($2 < 100) $1=1; else $1=0 Compare < constant; 2’s comp. set less than uns. sltu $1,$2,$3 if ($2 < $3) $1=1; else $1=0 Compare less than; natural numbers set l. t. imm. uns. l i sltiu l i $1,$2,100 $ $ if ($ if ($2 < 100) $1=1; else $1=0 )$ l $ Compare < constant; natural numbers jump j 10000 go to 10000 Jump to target address jump register jr $31 $ go to $31 $ For switch, procedure return jump and link jal 10000 $31 = PC + 4; go to 10000 For procedure call 7/2/2011 cslab@ntua 2010-2011 92 Εντολές διακλάδωσης-branching instructions branch if equal branch if !equal beq $s3, 4s4, L1 # goto L1 if $s3 equals $s4 bne $s3, 4s4, L1 # goto L1 if $s3 not equals $s4 unconditional Jump jr $t1 # goto $t1 ..... είναι I –Type εντολές slt $t0, $s3, $s4 #set $t0 to 1 if $s3 is less than $s4;else set $t0 to 0 Όμως: j L1 # goto L1 Πόσο μεγάλο είναι το μήκος του address L1; Πόσο «μεγάλο» μπορεί να είναι το άλμα; 7/2/2011 cslab@ntua 2010-2011 93 MIPS Branch I‐Type OP rs rt 6 bits 5 bits 5 bits address 16 bits – address: 16‐bit memory address branch target offset in words added to PC to form branch address. dd d t PC t f b h dd • Παραδείγματα : Παραδείγματα : 7/2/2011 Register in rs Final offset is calculated in bytes, equals to Register in rt {instruction field address} x 4, 4 e.g. new PC = PC + 400 • Branch on equal beq $1,$2,100 • Branch on not equal bne $1,$2,100 cslab@ntua 2010-2011 94 MIPS J‐Type J-Type: jump j, jump and link jal OP jump target 6 bits 26 bits – jump target: jump memory address in words. final jump memory address in bytes is calculated from {jump target} x 4 • Παραδείγματα : Παραδείγματα : – Branch on equal j 10000 – Branch on not equal jal 7/2/2011 cslab@ntua 2010-2011 10000 95 Other Jump Instructions • Jump (J‐type): p ( yp ) – j 10000 # jump to address 10000 • Jump Register (NB: R‐type!): – jr rs jr rs # jump to 32 bit address in register rs # jump to 32 bit address in register rs • Jump and Link (J‐type): – jal 10000 # jump to 10000 and save PC in R31 – Use jal for procedure calls, it saves the return address (PC+4) in lf d ll h dd ( ) register 31 ($ra) – Use “jr $ra” to return from subroutine – Nested procedures must save $ra on a stack, and should use registers N t d d t $ t k d h ld it $sp (stack pointer) and $fp (frame pointer) manage the stack. 7/2/2011 cslab@ntua 2010-2011 96 Summary of MIPS instruction formats • R R‐type type (add, sub, slt, jr) (add sub slt jr) op rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits • I‐type (beq, bne + addi, lui + lw, sw) op rs rt immediate value / address offset 6 bits 5 bits 5 bits 16 bits • J‐type (j, jal) Jt (j j l) op 6 bit bits 7/2/2011 jump target address 26 bit bits cslab@ntua 2010-2011 97 Απ’ ευθείας διευθυνσιοδότηση- Σταθερές Οι πιο πολλές αριθμητικές εκφράσεις σε προγράμματα, περιέχουν ρ χ σταθερές: ρ ς π.χ. χ index++ Στον κώδικα του gcc: 52% εκφράσεων έχουν constants Στον κώδικα του spice: 69% των εκφράσεων! Τι κάνουμε με τις σταθερές (και αν είναι > 16bit;) Θέλουμε: $s3=$s3+2 lw $t0, addr_of_constant_2($zero) add $s3,$s3,$t0 Αλλιώς: ς addi $s3,$s3,2 ((add immediate)) Όμοια: slti $t0,$s2, 10 # $t0=1 if $s2<10 7/2/2011 cslab@ntua 2010-2011 98 Τρόποι Διευθυνσιοδότησης στον MIPS: 1. Register Addressing 2. Base or Displacement Addressing 3. Immediate Addressingg 4. PC-relative addressing (address is the sum of the PC and a constant in the instruction) 5. Pseudodirect addressing (the jump address is the 26 bits of the instruction, concatenated with the upper bits off the h PC) 7/2/2011 cslab@ntua 2010-2011 99 1. Immediate addressing op rs rt addi $rt,$rs,immediate π.χ. lui $t0, 255 slti $t0, $s1, 10 Immediate I-Type 2 Register addressing 2. op rs rt rd ... funct Registers R-Type Register add $rd,$rs,$rt π.χ. add $t0,$s1,$s2 3. Base addressing op rs rt + Register π.χ. Memory Address Byte Halfword Word I-Type lw $rt,address($rs) lw $t1,100($s2) 4. PC-relative addressing op rs rt Memory Address PC + Word I-Type bne $rs,$rt,address # goto {4 x address (0:15)} π.χ. bne $s0,$s1,L2 5. Pseudodirect addressing op Memory Address Word PC J-Type j address # goto {4 x address(0:25)}(0:27)-(28:31)(PC) 7/2/2011 cslab@ntua 2010-2011 100 Addressing Modes : Παραδείγματα Addr. mode Παράδειγμα Έννοια χρήση Register add r4,r3 Regs[r4]← Regs[r4]+ Regs[r3] a value is in register Immediate add r4,#3 Regs[r4]← Regs[r4]+3 for constants Displacement add r4,100(r1) Regs[r4]← Regs[r4]+Mem[100+ Regs[r1]] local variables Reg. indirect add r4,(r1) Regs[r4]← Regs[r4]+Mem[Regs[r1]] accessing using a pointer or comp. address Indexed add r4,(r1+r2) Regs[r4]← Regs[r4]+Mem[Regs[r1]+ Regs[r2]] array addressing (base +offset) Direct add r4,(1001) Regs[r4]← Regs[r4]+Mem[1001] addr. static data Mem. Indirect add r4,@(r3) Regs[r4]← Regs[r4]+Mem[Mem[Regs[r3]]] g[ ] [ [ g [ ]]] if R3 keeps the address of a pointer p, this yields *p p Autoincrement add r4,(r3)+ Regs[r4]← Regs[r4]+Mem[Regs[r3]] Regs[r3]← Regs[r3]+d stepping through arrays within a loop; d defines size i off an element l Autodecrement add r4,-(r3) Regs[r3]← Regs[r3]-d Regs[r4]← Regs[r4]+Mem[Regs[r3]] similar as previous Scaled add r4,100(r2)[r3] , ( )[ ] Regs[r4]← g [ ] Regs[r4]+ g[ ] Mem[100+Regs[r2]+Regs[r3]*d] to index arrays y 7/2/2011 cslab@ntua 2010-2011 101
© Copyright 2024 Paperzz