ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Υ Γιώργος Δημητρίου Μάθημα 3 ο ΠΜΣ Εφαρμοσμένη Πληροφορική
ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ ΣΥΝΟΛΟΥ ΕΝΤΟΛΩΝ Αρχιτεκτονικές συσσωρευτή Αρχιτεκτονικές επέκτασης συσσωρευτή Αρχιτεκτονικές στοίβας Αρχιτεκτονικές καταχωρητών γενικού σκοπού (ΚΓΣ) Αρχιτεκτονικές καταχωρητή-μνήμης Αρχιτεκτονικές φόρτωσης-αποθήκευσης ή καταχωρητή-καταχωρητή
ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΣΥΣΣΩΡΕΥΤΗ Ένας μοναδικός καταχωρητής αντί φακέλου καταχωρητών Δεν αρκεί, γι αυτό υλοποιήθηκε η επέκταση συσσωρευτή Καταχωρητές-δείκτες για διευθυνσιοδότηση μνήμης Γενικά δε χρησιμοποιείται σήμερα Εκτός ίσως από κάποιους ενσωματωμένους επεξεργαστές, αλλά και 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 ; MEM[A] S[sp++] push B ; MEM[B] S[sp++] push C ; MEM[C] S[sp++] add ; S[--sp] + S[--sp] S[sp++] push D ; MEM[D] S[sp++] mult ; S[--sp] * S[--sp] S[sp++] sub ; S[--sp] - S[--sp] S[sp++] pop E ; 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
ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΦΟΡΤΩΣΗΣ-ΑΠΟΘΗΚΕΥΣΗΣ Κώδικας υπολογισμού της έκφρασης: C = A + B Πιο σύνθετα: load r1,a load r2,b add r3,r1,r2 store r3,c
ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ 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]++; MOV EAX,0 ; EAX = i = 0 _L: 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 _EXIT:
ΙΑ-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 RET ; and goto AProcedure ; 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 Εικονική αρχιτεκτονική Ανεξάρτητη υλικού Java bytecode Στην ουσία η JVM είναι ένας προσομοιωτής της αρχιτεκτονικής (ή ισοδύναμα ένας διερμηνέας των bytecodes της Java) Αρκεί να γραφτεί ο προσομοιωτής για κάθε υλικό Η JVM είναι αρχιτεκτονικής στοίβας JVM (interpreter)
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: 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 usual
JVM ΠΑΡΑΔΕΙΓΜΑ 1 Μετάφραση σε Java bytecode της έκφρασης: v = 3*(x/y - 2/(u+y)) όπου x, y, u και v είναι οι τοπικές μεταβλητές 0, 1, 3 και 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 ΣΥΜΠΕΡΑΣΜΑΤΑ Η JVM είναι αργή από τη στιγμή που είναι εικονική και προσομοιώνει την αρχιτεκτονική Αυτό δε συμβαίνει σε πραγματικές αρχιτεκτονικές στοίβας Σήμερα, αντί για εκτέλεση των bytecodes, τις περισσότερες φορές γίνεται μετάφραση με την τεχνική Just In-time Compilation (JIT) Οπότε τελικά εκτελείται κώδικας μηχανής του επεξεργαστή που έχουμε (native code), και όχι τα bytecodes της εικονικής μηχανής!