Γιώργος Δημητρίου Μάθημα 6 ο και 7 ο
Μοντέλα Συνόλων Εντολών Συσσωρευτή Επέκτασης συσσωρευτή Στοίβας Καταχωρητών γενικού σκοπού Μνήμης-μνήμης Καταχωρητή-μνήμης Καταχωρητή-καταχωρητή Κατηγοριοποίηση RISC & CISC
Διαφορές Μοντέλων Μέθοδοι διευθυνσιοδότησης μνήμης Απλές για μεγαλύτερη ταχύτητα Σύνθετες για ισχυρότερες εντολές Πολυπλοκότητα εντολών Απλές για ταχύτητα, κατανάλωση ενέργειας Σύνθετες για μικρότερο κώδικα Σήμερα κυριαρχεί η απλότητα
Διευθυνσιοδότηση Μνήμης Κατ ευθείαν διευθυνσιοδότηση διεύθυνση μνήμης Έμμεση διευθυνσιοδότηση δείκτης προς τη διεύθυνση μνήμης Σχετική διευθυνσιοδότηση έμμεση με μετατόπιση Δεικτοδοτούμενη διευθυνσιοδότηση με χρήση καταχωρητή-δείκτη Διευθυνσιοδότηση στοίβας Συνδυασμός των παραπάνω
Κατ ευθείαν Διευθυνσιοδότηση Εντολές μεταφοράς δεδομένων lda $34f7 (6502) Ε/Ε με απεικόνιση στη μνήμη, για τους περισσότερους επεξεργαστές Γραφικά με απεικόνιση στη μνήμη, όταν δεν υπήρχε κάρτα ούτε μνήμη γραφικών Αλλά και εντολές άλματος jsr printf (6502) Προορισμός πιθανά με ετικέτα
Έμμεση Διευθυνσιοδότηση Μέσω καταχωρητή Μέσω μνήμης add ($4),$2 (68000) lw $8,24($5) (MIPS) lda ($5f04) (6502)
Σχετική Διευθυνσιοδότηση Μετατόπιση στην προσπέλαση μνήμης αναφορά σχετική με καταχωρητή lw $5, -204($22) (MIPS) Μετατόπιση σε εντολή διακλάδωσης αναφορά σχετική με μετρητή προγράμματος beq $2, $12, L100 (MIPS) bcs.-5 (6502)
Χρήση Καταχωρητή-Δείκτη Καταχωρητής που περιέχει μέρος ή όλη τη μετατόπιση μιας διευθυνσιοδότησης lda $250c,X (6502) move ($5,$8), ($10,$12) (68000) lwx $10, -8($5,$8) (PowerPC) πολλές φορές ο καταχωρητής-δείκτης αυξάνεται ή μειώνεται αυτόματα πχ σε άλματα υπό συνθήκη (68000, PowerPC) dbra $8, L (68000)
Διευθυνσιοδότηση Στοίβας στοίβας στοίβας Στοίβα στη μνήμη Υλοποίηση ελέγχου με υλικό Ειδικές εντολές ελέγχου pushl %ebx (IA-32) Υλοποίηση ελέγχου με λογισμικό lw $6, 104($sp) (MIPS)
Αφήνοντας το Μοντέλο του MIPS Θα δούμε εναλλακτικά μοντέλα συνόλων εντολών Κυρίως παλαιότερα Κάποιες φορές χρησιμοποιούνται και σήμερα Πολύπλοκες εντολές και διευθυνσιοδοτήσεις μνήμης Για πιο αργούς, αλλά πιο οικονομικούς και λιγότερο ενεργοβόρους επεξεργαστές
Αρχιτεκτονική Συσσωρευτή Ένας μοναδικός καταχωρητής αντί φακέλου καταχωρητών Δεν αρκεί, γι αυτό υλοποιήθηκε η επέκταση συσσωρευτή Καταχωρητές-δείκτες για διευθυνσιοδότηση μνήμης Γενικά δε χρησιμοποιείται σήμερα Εκτός ίσως από κάποιους ενσωματωμένους επεξεργαστές, αλλά και Intel
Αρχιτεκτονική Συσσωρευτή latch Συσσωρευτής b+c b Καταχωρητές Διευθύνσεων ΑΛΜ latch διεύθυνση Μνήμη a b+c Παράδειγμα κώδικα για τον υπολογισμό: a = b+c; load b ; ο συσσωρευτής είναι υπονοούμενο τελούμενο add c store a
Αρχιτεκτονική Συσσωρευτή Κώδικας πρόσθεσης διανυσμάτων ldx #0 ; X 0 Loop: load V1,X ; A V1[X] add V2,X ; A A + V2[X] store V3,X ; V3[X] A incx ; X X + 1 incx incx incx cmpx #400 ; S cmp (X == 400) bne Loop ; if (!S cmp ) goto Loop όπου V1, V2, V3 οι διευθύνσεις βάσης τριών διανυσμάτων 100 ακεραίων 32-bit, Α ο συσσωρευτής, Χ καταχωρητής-δείκτης και S cmp ψηφίο κατάστασης για συγκρίσεις
Στοίβα καταχωρητών αντί φακέλου και αντί συσσωρευτή Πιο γρήγορη προσπέλαση από φάκελο καταχωρητών Ευελιξία για προσωρινή αποθήκευση στην αποτίμηση εκφράσεων Όχι όμως τόση ευελιξία όση έχουμε με ΦΚ Χρησιμοποιείται σε επιμέρους δομές του επεξεργαστή Υλικό κινητής υποδιαστολής Intel Αλλά και Java Virtual Machine Αρχιτεκτονική Στοίβας
Αρχιτεκτονική Στοίβας latch latch Στοίβα ΑΛΜ latch c b+c b sp Μνήμη a b+c Παράδειγμα κώδικα για τον υπολογισμό: a = b+c; push b ; Η στοίβα είναι υπονοούμενο τελούμενο push c add pop a
Αρχιτεκτονική Στοίβας Κώδικας υπολογισμού παράστασης push A push B push C add push D mult sub pop E ; MEM[A] S[sp++] ; MEM[B] S[sp++] ; MEM[C] S[sp++] ; S[--sp] + S[--sp] S[sp++] ; MEM[D] S[sp++] ; S[--sp] * S[--sp] S[sp++] ; S[--sp] - S[--sp] S[sp++] ; S[--sp] MEM[E] όπου A,B,C,D,E οι διευθύνσεις πέντε ακέραιων μεταβλητών, S η στοίβα και sp ο δείκτης κορυφής της στοίβας Προσοχή: Ο sp υλοποιείται στο υλικό και δεν είναι ορατός στον κώδικα! Ποια παράσταση υπολογίζεται;
Αρχιτεκτονικές ΚΓΣ Μνήμης-μνήμης VAX Καταχωρητή-μνήμης ΙΑ-32, 68000 και άλλοι παλαιότεροι επεξεργαστές Φόρτωσης-αποθήκευσης MIPS, ARM, POWERPC, SPARC και οι περισσότεροι σύγχρονοι επεξεργαστές
Αρχιτεκτονική Μνήμης-Μνήμης Κώδικας υπολογισμού της έκφρασης: C = A + B Πολύ απλά: add C,A,B
Αρχιτεκτονική ΚΓΣ-Μνήμης Κώδικας υπολογισμού της έκφρασης: C = A + B Λιγότερο απλά: load r1,a add r1,b store C,r1
Αρχιτεκτονικές RISC/CISC Απλού συνόλου εντολών (RISC): Απλές εντολές Ένας τρόπος διευθυνσιοδότησης μνήμης Σταθερό μήκος λέξης εντολής Πολύπλοκου συνόλου εντολών (CISC): Πολύπλοκες εντολές Πολλοί τρόποι διευθυνσιοδότησης μνήμης Μεταβλητό μήκος λέξης εντολής
Δύο Παραδείγματα ΙΑ-32 Μεταξύ αρχιτεκτονικής επέκτασης συσσωρευτή και ΚΓΣ-μνήμης JVM (Java Virtual Machine) Αρχιτεκτονική στοίβας αν και εικονική!
IA-32 Συνοπτικά Πολυπλοκότητα εντολών: Μέγεθος μεταβλητό από 1 μέχρι 17 bytes Μόνο δύο τελούμενα: το ένα είναι και εισόδου και εξόδου ADD EAX,EBX ; EAX = EAX+EBX Το ένα τελούμενο μπορεί να αναφέρεται στη μνήμη Σύνθετες μέθοδοι διευθυνσιοδότησης μνήμης Αιτία αυξημένης πολυπλοκότητας: Συμβατότητα! Ευτυχώς: Οι πιο συνήθεις εντολές υλοποιούνται εύκολα στο υλικό Οι μεταγλωττιστές αποφεύγουν τις πολύπλοκες (και άρα αργές) εντολές
IA-32 Καταχωρητές 16 8 8 ΚΓΣ AH BH CH AX BX CX AL BL CL EAX EBX ECX DH DX DL EDX ESI Δείκτες EDI EBP ESP CS SS Τμημάτων DS ES FS GS PC Κατάστασης EIP EFLAGS
IA-32 Διευθυνσιοδοτήσεις Άμεση (immediate) MOV EAX,10 ; EAX = 10 Κατ ευθείαν μνήμης (memory direct) MOV EAX,I ; EAX = Mem[i] Κατ ευθείαν καταχωρητή (register direct) MOV EAX,EBX ; EAX = EBX Έμμεση μέσω καταχωρητή (register indirect) MOV EAX,[EBX] ; EAX = Mem[EBX] Έμμεση με καταχ. βάσης και μετατόπιση 8 ή 32 bits MOV EAX,[EBX+8] ; EAX = Mem[EBX+8] Έμμεση με καταχ. βάσης και δείκτη με κλίμακα (0-3) MOV EAX,ECX[EBX]; EAX = Mem[EBX + 2 scale * ECX] Συνδυασμός των δύο προηγούμενων MOV EAX,ECX[EBX+8]
IA-32 Διευθυνσιοδοτήσεις Δε συνδυάζονται όλες οι μέθοδοι με όλες τις εντολές Το ένα τελούμενο πρέπει να είναι καταχωρητής Δε συνδυάζονται όλοι οι καταχωρητές με όλες τις εντολές Οι περιορισμοί οφείλονται στο πλήθος ψηφίων που κωδικοποιούν την εντολή
ΙΑ-32 Έλεγχος Κατάστασης Πολλές εντολές ορίζουν ψηφία ελέγχου στον καταχωρητή κατάστασης EFLAGS Τέτοια ψηφία είναι: sign: το αποτέλεσμα μιας πράξης είναι αρνητικό zero: το αποτέλεσμα μιας πράξης είναι μηδέν carry: η πράξη παράγει κρατούμενο εξόδου overflow: η πράξη παράγει υπερχείλιση parity: το αποτέλεσμα έχει άρτια ισοτιμία Επακόλουθες εντολές διακλάδωσης (δηλαδή άλματος υπό συνθήκη) ελέγχουν αυτά τα ψηφία για να αποφασίσουν εάν θα κάνουν άλμα
ΙΑ-32 Παράδειγμα Κώδικα Εντολή σύγκρισης που δίνει τιμή στα ψηφία κατάστασης (condition codes cc s) CMP SRC1,SRC2 ; set cc s based on SRC1-SRC2 Παράδειγμα for (i=0; i<10; i++) a[i]++; _L: _EXIT: MOV EAX,0 ; EAX = i = 0 CMP EAX,10 ; if (i<10) JNL _EXIT ; jump to _EXIT if i>=10 INC [EBX] ; Mem[EBX](=a[i])++ ADD EBX,4 ; EBX = &a[i+1] INC EAX ; EAX++ JMP _L ; goto _L
ΙΑ-32 Παράδειγμα Κώδικα Ειδική εντολή υποστήριξης βρόχων LOOP _LABEL ; decrease ECX, ; if (ECX!=0) goto _LABEL Το προηγούμενο παράδειγμα: for (i=0; i<10; i++) a[i]++; _L: MOV ECX,10 INC [EBX] ADD EBX,4 LOOP _L Λιγότερες εντολές, όμως η εντολή LOOP είναι αργή!
ΙΑ-32 Υποπρογράμματα Ειδικές εντολές κλήσεων CALL Aprocedure ; push return address on stack ; and goto AProcedure RET ; pop return address from ; stackand jump to it Ο καταχωρητής EBP χρησιμοποιείται ως δείκτης στο πλαίσιο δεδομένων της συνάρτησης (όπως ο $fp στον MIPS) Ο καταχωρητής ESP χρησιμοποιείται ως δείκτης στοίβας (όπως ο $sp στον MIPS) Ειδικές εντολές στοίβας: PUSH EAX ; ESP -= 4, Mem[ESP] = EAX POP EAX ; EAX = Mem[ESP], ESP += 4
IA-32 Γλώσσα Μηχανής Bytes 0-5 1-2 0-1 0-1 0-4 0-4 prefix opcode mode sib displ imm Bits 6 1 1 Source operand Byte/word Bits 2 3 3 mod reg r/m Bits 2 3 3 scale index base 00 memory 01 memory+d8 10 memory+d16/d32 11 register
ΙΑ-32 Συμπεράσματα Εμφανώς CISC Μεταβλητό μέγεθος Πολλές διαφορετικές μορφές εντολών Πολύπλοκες μέθοδοι διευθυνσιοδότησης Πολλές ιδιαίτερες εντολές που δε συναντήσαμε στον MIPS (λόγω CISC έναντι RISC) Αργή εκτέλεση αλλά εσωτερική μετατροπή σε εντολές RISC!! Άρα γρήγορη εκτέλεση για τις κοινές εντολές
JVM Συνοπτικά Java program Java compiler Java bytecode JVM (interpreter) Σκοπός η φορητότητα των προγραμμάτων JAVA Εικονική αρχιτεκτονική Ανεξάρτητη υλικού Στην ουσία η JVM είναι ένας προσομοιωτής της αρχιτεκτονικής (ή ισοδύναμα ένας διερμηνέας των bytecodes της Java) Αρκεί να γραφτεί ο προσομοιωτής για κάθε υλικό Η JVM είναι αρχιτεκτονικής στοίβας
JVM Ενδεικτικές Εντολές iload_n: push local variable n onto the stack iconst_n: push constant n onto the stack (n=-1,0,,5) bipush imm8: push byte onto stack sipush imm16: push short onto stack istore_n: pop word from stack into local variable n iadd, isub, ineg, imul, idiv, irem: usual arithmetic operations if_icmpxx offset16 (XX can be eq, ne, lt, gt, le, ge): pop TOS into a pop TOS into b if (b XX a) PC = PC + offset16 goto offset16 : PC = PC + offset16
JVM Παράδειγμα 1 Μετάφραση σε Java bytecode της έκφρασης: v = 3*(x/y - 2/(u+y)) όπου x είναι η τοπική μεταβλητή 0, y η τοπική μεταβλητή 1, u η τοπική μεταβλητή 3, και v η τοπική μεταβλητή 4 (Οι τοπικές μεταβλητές είναι στην ουσία προσωρινές μεταβλητές στη μνήμη και όχι στη στοίβα εκτέλεσης πράξεων) Στοίβα iconst_3 ; 3 iload_0 ; x 3 iload_1 ; y x 3 idiv ; x/y 3 iconst_2 ; 2 x/y 3 iload_3 ; u 2 x/y 3 iload_1 ; y u 2 x/y 3 iadd ; u+y 2 x/y 3 idiv ; 2/(u+y) x/y 3 isub ; x/y - 2/(u+y) 3 imul ; 3*(x/y - 2/(u+y)) istore_4 ; v = 3*(x/y - 2/(u+y))
JVM Παράδειγμα 2 Μετάφραση σε Java bytecode του κώδικα Java: if (x < 2) x = 0; όπου x η τοπική μεταβλητή 0 Στοίβα iload_0 ; x iconst_2 ; 2 x if_icmpge endif ; if (x>=2) goto endif iconst_0 ; 0 istore_0 ; endif:
Η JVM είναι αργή από τη στιγμή που είναι εικονική και προσομοιώνει την αρχιτεκτονική Αυτό δε συμβαίνει σε πραγματικές αρχιτεκτονικές στοίβας Σήμερα, αντί για εκτέλεση των bytecodes, τις περισσότερες φορές γίνεται μετάφραση με την τεχνική Just In-time Compilation (JIT) Οπότε τελικά εκτελείται κώδικας μηχανής του επεξεργαστή που έχουμε, και όχι τα bytecodes της εικονικής μηχανής! JVM Συμπεράσματα