X86

Ο όρος x86 αναφέρεται σε μια οικογένεια από αρχιτεκτονικές συνόλου εντολών που βασίζονται στην CPU Intel 8086. Ο επεξεργαστής 8086 κυκλοφόρησε το 1978 σαν μια πλήρως 16-bit επέκταση του 8080 της Intel που βασιζόταν σε τεχνολογία 8-bit, και εισήγαγε το segmentation για να ξεπεράσει το φράγμα των 16-bit διευθύνσεων της προηγούμενης σχεδίασης. Ο όρος x86 προήλθε από το γεγονός ότι οι πρώτοι απόγονοι του 8086 είχαν και αυτοί ονόματα που τελείωναν σε "86". Με τα χρόνια έχουν γίνει πολλές προσθήκες και επεκτάσεις στο σύνολο εντολών x86, σχεδόν πάντα με βάση την προς τα πίσω συμβατότητα (backward compatibility). Η αρχιτεκτονική έχει υλοποιηθεί σε επεξεργαστές της Intel, της Cyrix, της AMD, της VIA, και πολλών άλλων εταιρειών. Ο όρος δεν είναι συνώνυμος με την συμβατότητα με τον IBM PC: η τελευταία απαιτεί και άλλο υλικό. Υπήρξαν και άλλα συστήματα που χρησιμοποίησαν τσιπ x86, όπως τα ενσωματωμένα συστήματα και ο φορητός υπολογιστής GRID Compass, κάποιες φορές πριν από τον ίδιο τον IBM PC. Ο όρος διαδόθηκε μετά την κυκλοφορία του 80386, και υπονοεί συνήθως συμβατότητα με το σύνολο εντολών 32-bit του 80386. Αυτό συχνά γράφεται και σαν x86-32 για να ξεχωρίζει από το αρχικό "x86-16" που ήταν 16-bit ή από το x86-64 που είναι 64-bit. Αν και οι περισσότεροι επεξεργαστές x86 που χρησιμοποιούνται σε νέους προσωπικούς υπολογιστές και εξυπηρετητές έχουν δυνατότητες 64-bit, για να αποφεύγονται προβλήματα συμβατότητας με παλαιότερους υπολογιστές ή συστήματα, συχνά χρησιμοποιείται ο όρος x86-64 (ή x64) για να υποδηλώνει λογισμικό 64-bit, με τον όρο x86 να χρησιμοποιείται μόνο για λογισμικό 32-bit.Αν και ο 8086 αναπτύχθηκε αρχικά για ενσωματωμένα συστήματα και μικρούς προσωπικούς υπολογιστές (για χρήση δηλαδή από έναν χρήστη), ως απάντηση στον επιτυχημένο Zilog Z80 που ήταν 8080-συμβατός, σύντομα η γραμμή των x86 απέκτησε περισσότερα χαρακτηριστικά και επεξεργαστική ισχύ. Σήμερα οι x86 είναι πολύ διαδεδομένοι στους σταθερούς και στους φορητούς υπολογιστές και έχουν αντικαταστήσει τους μεσαίου μεγέθους υπολογιστές (midrange computers) και τους επεξεργαστές RISC σε πολλούς εξυπηρετητές και σταθμούς εργασίας. Το υλικό των x86 υποστηρίζεται από ένα μεγάλο μέρος του λογισμικού, όπως τα λειτουργικά συστήματα DOS, Windows, Linux, BSD, Solaris και Mac OS X. Οι σύγχρονοι x86 δεν απαντώνται συχνά σε ενσωματωμένα συστήματα και σε εφαρμογές με απαιτήσεις χαμηλής κατανάλωσης ενέργειας (όπως αυτές που βασίζονται σε μικρές μπαταρίες), ούτε σε αγορές φτηνών μικροεπεξεργαστών, όπως οι οικιακές συσκευές και τα παιχνίδια. Συνήθως χρησιμοποιούνται απλές αρχιτεκτονικές 8-bit και 16-bit, αν και υπάρχουν οι x86-συμβατοί VIA C7, VIA Nano, AMD Geode, Athlon Neo, και Intel Atom, που είναι σχεδιάσεις 32-bit και 64-bit με σχετικά μικρή κατανάλωση και κόστος. Πολλοί έχουν προσπαθήσει, συμπεριλαμβανομένης της ίδιας της Intel, να αντικατασταθεί η "άκομψη" αρχιτεκτονική x86, η οποία είχε προκύψει κατευθείαν από τους πρώτους απλούς μικροεπεξεργαστές 8-bit. Παραδείγματα είναι ο iAPX 432 (γνωστός και σαν Intel 8800), ο Intel 960, ο Intel 860 και η αρχιτεκτονική Itanium της Intel και της Hewlett Packard. Παρόλα αυτά, η συνεχής βελτίωση της μικροαρχιτεκτονικής και των κυκλωμάτων των x86, καθώς και η ανάπτυξη της βιομηχανίας των ημιαγωγών έχουν εδραιώσει τους x86 σε πολλές περιοχές εφαρμογών. Η επέκταση 64 bit της AMD για τους x86 (στην οποία η Intel τελικά απάντησε με μια συμβατή σχεδίαση) και η δυνατότητα των x86 να κλιμακώνουν τις επιδόσεις τους, όπως ο οκταπύρηνος Intel Xeon και ο 12-πύρηνος AMD Opteron δείχνουν πώς στην περίπτωση του x86 η συνεχής εξέλιξη κλασικών βιομηχανικών προτύπων μπορεί να αντεπεξέλθει στον ανταγωνισμό από νέες και διαφορετικές αρχιτεκτονικές.Σημείωση: Στο κείμενο που ακολουθεί, κάθε χρήση των προθεμάτων kilo/mega/giga/tera έχει τη δυαδική τους σημασία (δυνάμεις του 1024).

 Στον παρακάτω πίνακα φαίνονται τα εμπορικά ονόματα κοινών επεξεργαστών που υλοποιούν το σύνολο εντολών x86, ομαδοποιημένα ανά γενιές που δείχνουν κάποια σημαντικά σημεία στην ιστορία του x86. Να σημειωθεί ότι οι γενιές αυτές δεν είναι ακριβείς: κάθε μια ορίζει ένα γενικό πλαίσιο με βάση κάποια βελτιωμένη ή εμπορικά πετυχημένη μικροαρχιτεκτονική επεξεργαστών. Η αρχιτεκτονική x86 κυκλοφόρησε για πρώτη φορά το 1978 με την ΚΜΕ Intel 8086, που ήταν μια πλήρως 16-bit σχεδίαση, η οποία είχε βασιστεί στους παλιότερους επεξεργαστές 8-bit 8008 και 8080. Αν και δεν ήταν συμβατή στο επίπεδο του δυαδικού κώδικα (binary compatible), σχεδιάστηκε έτσι ώστε να επιτρέπει σε προγράμματα συμβολικής γλώσσας που είχαν γραφτεί για αυτούς τους επεξεργαστές (και για τον σύγχρονό τους 8085) να μεταφράζονται μηχανικά σε αντίστοιχη συμβολική γλώσσα 8086. Αυτό είχε σαν συνέπεια ο νέος επεξεργαστής να αποτελέσει ελκυστική λύση για πολλούς καταναλωτές. Ο εξωτερικός δίαυλος όμως του 8086 ήταν 16-bit και αυτό οδήγησε σε σημαντική επανασχεδίαση του υλικού, καθώς επίσης και σε άλλες επιπλοκές και σημεία που το κόστος αυξανόταν. Για να αντιμετωπίσει αυτό το εμπόδιο, η Intel εισήγαγε τον σχεδόν πανομοιότυπο 8088, ο οποίος στην πραγματικότητα ήταν ένας 8086 με εξωτερικό δίαυλο 8-bit που επέτρεπε απλούστερες πλακέτες τυπωμένων κυκλωμάτων (printed circuit boards) και χρειαζόταν λιγότερα τσιπ DRAM (του 1-bit) - ήταν επίσης πιο εύκολο να επικοινωνήσει με τα ήδη διαδεδομένα (δηλ. χαμηλού κόστους) συστήματα και περιφερειακά τσιπ που ήταν 8-bit. Αυτό, μαζί με άλλους, μη τεχνικούς λόγους, οδήγησε στην απόφαση της IBM να κατασκευάσει έναν οικιακό / προσωπικό υπολογιστή με βάση τον 8088, παρά τη διαθεσιμότητα επεξεργαστών 16-bit από την Motorola, την Zilog και την National Semiconductor (ενώ εξέτασε επίσης και άλλους επεξεργαστές 8-bit που ήδη κυκλοφορούσαν). Ο IBM PC που προέκυψε, επικράτησε των συστημάτων CP/M με βάση τον Z80, των υπολογιστών Apple II, και άλλων διαδεδομένων υπολογιστών, με αποτέλεσμα να γίνει το ντε φάκτο πρότυπο των προσωπικών υπολογιστών και ο 8088 και οι απόγονοί του να επικρατήσουν σε αυτόν τον κλάδο της αγοράς μικροεπεξεργαστών. Ο iAPX 432 και ο 80286 Ένας άλλος παράγοντας ήταν ο προχωρημένος αλλά ασύμβατος επεξεργαστής 32-bit Intel 8800 (γνωστός και σαν iAPX 432) που απέτυχε στην αγορά περίπου την ίδια εποχή που κυκλοφόρησε ο IBM-PC: ο 8800 απογοήτευσε από πλευράς ταχύτητας σε σχέση με τον καινούριο και γρήγορο 80286 στις αρχές του 1982. (Ο 80186, που κυκλοφόρησε παράλληλα με τον 80286, προοριζόταν για ενσωματωμένα συστήματα, και στόχευε ήδη σε μια μεγάλη αγορά.) Η εμπορική αποτυχία του 32-bit 8800 ήταν ένας βασικός λόγος που η Intel συνέχισε να αναπτύσσει πιο προχωρημένους επεξεργαστές συμβατούς με τον 8086, όπως ο 80386 (επέκταση στα 32-bit του γρήγορου 80286). Διάφορες εταιρείες, όπως η IBM, η NEC, η AMD, η TI, η STM, η Fujitsu, η OKI, η Siemens, η Cyrix, η Intersil, η C&T, η NexGen και η UMC, άρχισαν να σχεδιάζουν και να κατασκευάζουν επεξεργαστές για προσωπικούς υπολογιστές και ενσωματωμένα συστήματα. Αυτά οι υλοποιήσεις του x86 συνήθως δεν ήταν απλές αντιγραφές αλλά είχαν διαφορετική εσωτερική μικροαρχιτεκτονική και παρείχαν διαφορετικές λύσεις σε ηλεκτρονικά και φυσικά προβλήματα υλοποίησης. Τα πρώτα συμβατά τσιπ ήταν 16-bit, ενώ σχεδιάσεις 32-bit ακολούθησαν πολύ αργότερα. Στην αγορά των προσωπικών υπολογιστών, οι πρώτες σημαντικές ποσότητες εμφανίστηκαν γύρω στο 1990 με τους επεξεργαστές που ήταν συμβατοί με τον i386 και τον i486, συχνά χρησιμοποιώντας το ίδιο όνομα με τα πρωτότυπα τσιπ της Intel. Άλλες εταιρείες που σχεδίασαν ή κατασκεύασαν επεξεργαστές x86 ή x87 ήταν η ITT Corporation, η National Semiconductor, η ULSI System Technology και η Weitek. Μετά τον i486 που είχε πλήρη διοχέτευση (pipelining), η Intel κυκλοφόρησε την εμπορική ονομασία Pentium (η οποία, σε αντίθεση με τους κωδικούς αριθμούς, μπορούσε να κατοχυρωθεί σαν εμπορικό σήμα) για τη νέα της γραμμή υπερβαθμωτών (superscalar) σχεδιάσεων x86. Λόγω της εξαφάνισης των ονομασιών x86 για νομικούς λόγους, η IBM συνεργάστηκε με την Cyrix για την κατασκευή του 5x86 και στη συνέχεια των γρήγορων σχεδιάσεων 6x86 (M1) και 6x86MX (MII) της Cyrix, που ήταν τα πρώτα τσιπ x86 που υλοποίησαν μετονομασία καταχωρητών (register renaming) ώστε να είναι δυνατή η υποθετική εκτέλεση (speculative execution). Παράλληλα, η AMD σχεδίασε και κατασκεύασε (αλλά κυκλοφόρησε με καθυστέρηση) τον προχωρημένο 5k86 (K5), ο οποίος, εσωτερικά, ήταν βασισμένος σε σημαντικό βαθμό στις παλιότερες σχεδιάσεις 29K RISC της AMD - παρόμοια με τον Nx586 της NexGen, χρησιμοποιούσε μια στρατηγική όπου αφιερωμένες βαθμίδες της διοχέτευσης αποκωδικοποιούν εντολές x86 σε εύκολα διαχειρίσιμες μικρολειτουργίες (micro-operations), μια μέθοδος που από τότε έγινε ο κανόνας για τις περισσότερες σχεδιάσεις του x86 μέχρι σήμερα. Κάποιες πρώιμες εκδόσεις αυτών των τσιπ είχαν προβλήματα απαγωγής θερμότητας. Ο 6x86 είχε επίσης κάποια μικρά προβλήματα συμβατότητας και από τον Nx586 έλειπε η μονάδα κινητής υποδιαστολής (FPU) και η (τότε σημαντική) συμβατότητα σε ακίδες (pin-compatibility), ενώ ο K5 αποδείχτηκε λιγο αργός, όταν (τελικά) κυκλοφόρησε. Πολλοί καταναλωτές επίσης δεν γνώριζαν για αυτές τις εναλλακτικές έναντι του Pentium. Αυτά τα προβλήματα οδήγησαν σε εμπορική αποτυχία των εναλλακτικών σχεδιάσεων, παρά το γεγονός ότι ο K5 είχε πολύ καλή συμβατότητα με τον Pentium και ο 6x86 ήταν σημαντικά πιο γρήγορος από τον Pentium σε πράξεις ακεραίων. Η AMD αργότερα κατάφερε να εδραιωθεί σαν σημαντικός παίχτης στην αγορά, λόγω των επεξεργαστών K6, ενώ τελικά ανέπτυξε τους πολύ επιτυχημένους Athlon και Opteron. Υπήρξαν και άλλες εταιρείες που συμμετείχαν στην αγορά, όπως η Centaur Technology (γνωστή παλιότερα σαν IDT), η Rise Technology και η Transmeta. Η επεξεργαστές C3 και C7 της VIA Technologies, που έχουν χαμηλή κατανάλωση ενέργειας, σχεδιάστηκαν από την Centaur και κυκλοφορούν για μεγάλο χρονικό διάστημα. Η τελευταία σχεδίαση της Centaur, ο VIA Nano, είναι ο πρώτος επεξεργαστής τους με υπερβαθμωτή και υποθετική εκτέλεση. Έχει ενδιαφέρον το ότι κυκλοφόρησε περίπου την ίδια χρονική περίοδο με τον πρώτο επεξεργαστή της Intel με εκτέλεση εντός σειράς ("in-order") μετά τον Pentium P5, τον Intel Atom. Η αρχιτεκτονική του συνόλου εντολών έχει επεκταθεί δύο φορές για μεγαλύτερα μεγέθη λέξης (word size). Το 1985, η Intel κυκλοφόρησε τον επεξεργαστή 32-bit 80386 (γνωστό και σαν i386), ο οποίος σταδιακά αντικατέστησε τα παλιά τσιπ 16-bit στους υπολογιστές (να και δε συνέβη το ίδιο στα ενσωματωμένα συστήματα) κατά τα επόμενα χρόνια: το επαυξημένο αυτό προγραμματιστικό μοντέλο αρχικά ονομάστηκε αρχιτεκτονική του i386 ("i386 architecture"), λόγω του ονόματος της πρώτης του υλοποίησης, αλλά στη συνέχεια η Intel το ονόμασε IA-32 όταν εισήγαγε την (διαφορετική) αρχιτεκτονική IA-64. Μεταξύ 1999-2003, η AMD επέκτεινε αυτήν την αρχιτεκτονική 32-bit στα 64 bits και την ονόμασε x86-64 (σε αρχικά της έγγραφα) και στη συνέχεια AMD64. Σύντομα η Intel υιοθέτησε αυτές της επεκτάσεις της AMD κάτω από το όνομα IA-32e, το οποίο στη συνέχεια άλλαξε σε EM64T, και τελικά κατέληξε στο όνομα Intel 64. Ανάμεσα σε αυτά τα πέντε ονόματα, η πιο κοινή ονομασία είναι η αρχική x86-64, αν και η Microsoft και η Sun Microsystems ακόμα χρησιμοποιούν τον όρο x64. Η αρχιτεκτονική x86 έχει εντολές μεταβλητού μήκους και είναι κυρίως σχεδίαση "CISC" δύο διευθύνσεων με έμφαση στην προς τα πίσω συμβατότητα (backward compatibility). Το σύνολο εντολών δεν είναι όμως κλασικό CISC, αλλά επεκτείνει με διακριτό τρόπο τις απλές αρχιτεκτονικές 8-bit του 8008 και του 8080. Υποστηρίζεται η διευθυνσιοδότηση με byte και οι λέξεις αποθηκεύονται στη μνήμη σε σειρά μικρού άκρου (little-endian). Επιτρέπεται η πρόσβαση στη μνήμη σε διευθύνσεις που δεν είναι στοιχισμένες (unaligned) για όλα τα μεγέθη λέξεων που επιτρέπονται. Το μεγαλύτερο μέγεθος που υποστηρίζεται εγγενώς για αριθμητική ακεραίων και διευθύνεσιες μνήμης ή σχετικές διευθύνσεις-offsets) είναι 16, 32, ή 64 bits ανάλογα με τη γενιά της αρχιτεκτονικής (οι νεότεροι επεξεργαστές υποστηρίζουν απευθείας και μικρότερους ακεραίους). Πολλές απλές τιμές μπορούν να επεξεργαστούν ταυτόχρονα μέσω της μονάδας SIMD που περιλαμβάνεται στις μεταγενέστερες γενιές, όπως περιγράφεται στη συνέχεια. Για κοινές καταστάσεις και τιμές που βρίσκονται στο εύρος -128..127, για χρήση σε σχετικές διευθύνσεις ή απλά δεδομένα, μπορούν να χρησιμοποιηθούν κατευθείαν αριθμοί 8-bit. Οι εντολές συνήθως έχουν μήκος 2 ή 3 byte (αν και κάποιες είναι πολύ μεγαλύτερες και άλλες είναι ένα byte). Για να εξοικονομηθεί και άλλο χώρος για την κωδικοποίηση των εντολών, οι περισσότεροι καταχωρητές (registers) εκφράζονται σαν κώδικες (opcodes) με χρήση 3 bit, και το πολύ ένας τελεστέος μιας εντολής μπορεί να είναι θέση μνήμης (υπάρχουν σχεδιάσεις "CISC", όπως ο PDP-11, που χρησιμοποιούν δύο). Αυτός ο τελεστέος όμως μπορεί να είναι ταυτόχρονα και ο προορισμός (destination), ή ταυτόχρονα η προέλευση (source) και ο προορισμός, ενώ ο άλλος τελεστέος, η προέλευση, μπορεί να είναι είτε καταχωρητής (register), είτε απευθείας τιμή (immediate). Αυτό, μαζί με άλλους παράγοντες, οδηγεί σε μικρό μέγεθος κώδικα που συμπεριφέρεται καλά σε σχέση με τους επεξεργαστές 8-bit και χρησιμοποιεί αποδοτικά την κρυφή μνήμη για τις εντολές (instruction cache memory). Ο σχετικά μικρός αριθμός των καταχωρητών γενικής χρήσης (κληρονομιά των 8-bit επεξεργαστών) έχει οδηγήσει σε συχνή χρήση της διευθυνσιοδότησης με βάση καταχωρητές (register-relative addressing) και μικρές σχετικές διευθύνσεις, ειδικά για πρόσβαση στην στοίβα. Έχει υπάρξει σημαντική έρευνα για να γίνουν αυτές οι περιπτώσεις πρόσβασης τόσο γρήγορες, όσο η πρόσβαση στους καταχωρητές, δηλ. με μια μόνο εντολή, συνήθως όταν τα δεδομένα υπάρχουν ήδη στην κρυφή μνήμη πρώτου επιπέδου. Αριθμοί κινητής υποδιαστολής και SIMD Για τον αρχικό επεξεργαστή 8086 αναπτύχθηκε ένας ξεχωριστός επεξεργαστής κινητής υποδιαστολής, με εσωτερικούς καταχωρητές 80-bit, ο 8087. Το τσιπ αυτό τελικά οδήγησε στην ανάπτυξη του 80387, ενώ οι μεταγενέστεροι επεξεργαστές ενσωμάτωσαν μια προς τα πίσω συμβατή έκδοση αυτής της λειτουργικότητας στο ίδιο τσιπ με τον κύριο επεξεργαστή. Οι μοντέρνες σχεδιάσεις x86 περιλαμβάνουν επιπλέον μια μονάδα SIMD (βλ. παρακάτω, SSE) όποι οι εντολές μπορούν να εκτελούνται παράλληλα σε (μία ή δύο) λέξεις των 128-bit, με κάθε λέξη να περιέχει 2 ή 4 αριθμούς κινητής υποδιαστολής (μήκους 64 ή 32 bit ο καθένας), ή εναλλακτικά 2, 4, 8 ή 16 ακεραίους (μήκους 64, 32, 16 ή 8 bit ο καθένας αντίστοιχα). Το εύρος των καταχωρητών SIMD σημαίνει ότι οι επεξεργαστές x86 που υπάρχουν σήμερα μπορούν να φορτώσουν ή να αποθηκεύσουν μέχρι 128 bit δεδομένων από τη μνήμη με μια μόνο εντολή και να εκτελέσουν λειτουργίες επιπέδου bit (αλλά όχι αριθμητική ακεραίων) σε ποσότητες πλήρως 128-bit παράλληλα. Οι επόμενοι επεξεργαστές x86 έχουν λειτουργίες SIMD 256-bit (με φόρτωση και αποθήκευση στη μνήμη 256-bit). Κατά τη διάρκεια της εκτέλεσης, οι σύγχρονοι επεξεργαστές x86 χρησιμοποιούν κάποιων επιπλέον σταδίων αποκωδικοποίησης για να σπάσουν τις περισσότερες εντολές σε μικρότερα κομμάτια, τις μικρο-εντολές (micro-operations). Αυτές δίνονται σε μια μονάδα ελέγχου που τις κρατά και κατανέμει χρονικά την εκτέλεσή τους, διατηρώντας πάντα τη συμβατότητα με τη σημασιολογία του x86, ώστε να μπορούν να εκτελεστούν παράλληλα (εν μέρει), από μια εξειδικευμένη μονάδα εκτέλεσης (ο επεξεργαστής έχει αρκετές τέτοιες μονάδες διαθέσιμες). Αυτές οι σύγχρονες σχεδιάσεις x86 είναι επομένως υπερβαθμωτές (superscalar), και μπορούν να εκτελούν εντολές εκτός σειράς (out of order execution) και υποθετικά (μέσω μετονομασίας καταχωρητών), το οποίο σημαίνει ότι μπορούν να εκτελούν ταυτόχρονα πολλές εντολές x86 (κατά τμήματα ή ολόκληρες), και όχι απαραίτητα με την ίδια σειρά με την οποία δόθηκαν από το πρόγραμμα που εκτελείται. Όταν πρωτοκυκλοφόρησε αυτή η τεχνολογία ονομάστηκε "πυρήνας RISC" ("RISC core") ή "μετάφραση RISC" ("RISC translation"), για εμπορικούς λόγους, αλλά και γιατί αυτές οι μικρο-εντολές έχουν κάποιες ιδιότητες που έχουν κάποια είδη των εντολών RISC. Παρόλα αυτά, ο παραδοσιακός μικροκώδικας (microcode) που χρησιμοποιείται από τη δεκαετία του 1950 έχει επίσης αυτές τις ιδιότητες και η μόνη διαφορά της νέας αυτής προσέγγισης ήταν ότι η μετάφραση σε μικρο-λειτουργίες τώρα γινόταν με ασύγχρονο τρόπο. Οι μονάδες εκτέλεσης δε χρειαζόταν να συγχρονίζονται με τα στάδια αποκωδικοποίησης, κάτι που πρόσφερε νέες δυνατότητες για την ανάλυση της (αποθηκευμένης) ροής των εντολών, και τον εντοπισμό λειτουργιών που μπορούν να εκτελεστούν παράλληλα, τροφοδοτώντας παραπάνω από μια μονάδα εκτέλεσης. Νεότεροι επεξεργαστές κάνουν και το αντίστροφο: συνδυάζουν κάποιες ακολουθίες από εντολές του x86 (όπως μια εντολής σύγκρισης που ακολουθείται από ένα άλμα υπό συνθήκη) σε πολυπλοκότερες μικρο-εντολές που ταιριάζουν καλύτερα στο μοντέλο εκτέλεσης και μπορούν να εκτελεστούν γρηγορότερα ή με χρήση λιγότερων πόρων. Μια άλλη τεχνική προς την κατεύθυνση της αύξησης της ταχύτητας είναι η προσωρινή αποθήκευση αποκωδικοποιημένων μικρο-εντολών, ώστε ο επεξεργαστής να μπορεί άμεσα να τις χρησιμοποιήσει ξανά, αντί να πρέπει να αποκωδικοποιήσει πάλι κάποιες εντολές. Το πιο γνωστό παράδειγμα τέτοιας μνήμης βρίσκεται στη μικροαρχιτεκτονική NetBurst της Intel (οι επεξεργαστές Pentium 4) και ονομάζεται Execution Trace Cache. Η Transmeta χρησιμοποιεί μια τελείως διαφορετική μέθοδο στους επεξεργαστές της που είναι συμβατοί με τους x86. Χρησιμοποιούν μια μετάφραση της τελευταίας στιγμής (just-in-time translation) για να μετατρέπουν εντολές x86 σε εντολές που καταλαβαίνει ο ίδιος ο επεξεργαστής. Η Transmeta υποστηρίζει ότι αυτή προσέγγιση οδηγεί σε σχεδίαση με χαμηλότερη κατανάλωση ενέργειας επειδή ο επεξεργαστής μπορεί να αγνοήσει το πολύπλοκο στάδιο αποκωδικοποίησης των κλασικών υλοποιήσεων x86. Στα τέλη της δεκαετίας του 1970, λόγω του χαμηλού κόστους της μνήμης, οι μικροϋπολογιστές έφτασαν το όριο διευθύνσεων στα 16-bit που ήταν 64-KB. Κάποιοι μικροϋπολογιστές όπως ο PDP-11 χρησιμοποιούσαν κάποιες πολύπλοκες τεχνικές εναλλαγής πινάκων μνήμης (bank-switching), ενώ άλλοι, όπως ο VAX της Digital, σχεδίασαν ακριβότερους επεξεργαστές που μπορούσαν να χειριστούν απευθείας διευθύνσεις και δεδομένα των 32-bit. Ο αρχικός 8086, ο οποίος είχε προκύψει από τον απλό μικροεπεξεργαστή 8080 και στόχευε σε χρήση σε μικρούς και φτηνούς υπολογιστές, έκανε χρήση απλών καταχωρητών τμήματος (segment registers), οι οποίοι αύξησαν το εύρος των διευθύνσεων μνήμης μόνο κατά 4 bit. Πολλαπλασιάζοντας μια διεύθυνση 64-KB με το 16, η διεύθυνση 20-bit που προέκυπτε μπορούσε να διευθυνσιοδοτήσει συνολικά ένα megabyte (1,048,576 byte), ένα αρκετά μεγάλο μέγεθος για τους μικρούς υπολογιστές της εποχής. Η ιδέα των καταχωρητών τμήματος δεν ήταν νέα, πολλοί από τους παλαιότερους μεγαλύτερους υπολογιστές χρησιμοποιούσαν καταχωρητές τμήματος για να κάνουν την εναλλαγή μεταξύ διαφορετικών εργασιών. Στην πράξη, η τεχνική αυτή, όπως υλοποιήθηκε στον x86 δέχτηκε σημαντική κριτική γιατί έκανε πιο πολύπλοκο τον προγραμματισμό και τη συγγραφή μεταγλωττιστών. Αν και η αρχιτεκτονική σύντομα επέτρεψε τις γραμμικές διευθύνσεις 32-bit (αρχίζοντας από τον 80386 του 1985), σημαντικές εταιρείες (όπως η Microsoft) άργησαν πολλά χρόνια να μετατρέψουν τα 16-bit συστήματά τους. Ο 80386 (και ο 80486) για πολλά χρόνια χρησιμοποιήθηκε σαν ένας γρηγορότερος 8086, συμβατός με τα 16-bit. Τα δεδομένα και ο κώδικας μπορούσαν να χρησιμοποιηθούν σε "κοντινά" ("near") τμήματα 16-bit μέσα σε αυτόν τον χώρο διευθύνσεων του 1 MB, ενώ ένας μεταγλωττιστής μπορούσε να λειτουργεί με "μακρινό" ("far") τρόπο χρησιμοποιώντας ζεύγη 32-bit τμήμα:μετατόπιση που να φτάνουν μέχρι το 1 MB. Αν και αυτό στη συνέχεια της δεκαετίας του 1980 αποδείχτηκε εξίσου περιοριστικό, λειτούργησε για την αγορά των PC που τότε εμφανιζόταν και διευκόλυνε πολύ την μετάφραση λογισμικού από τους παλιούς 8008, 8080, 8085, και Z80 για τον νέο επεξεργαστή. Το 1985, το μοντέλο διευθύνσεων με τμήματα 16-bit πρακτικά απομακρύνθηκε, με την χρήση καταχωρητών μετατόπισης 32-bit, στη σχεδίαση του 386. Στην πραγματική κατάσταση (real mode), η διευθυνσιοδότηση μνήμης με τμήματα γίνεται με την ολίσθηση της διεύθυνσης τμήματος κατά 4 bit αριστερά και την προσθήκη της μετατόπισης ώστε να προκύψει η τελική διεύθυνση 20-bit. Για παράδειγμα, αν ο DS είναι A000h και ο SI είναι 5677h, το DS:SI δείχνει στην απόλυτη διεύθυνση DS × 10h + SI = A5677h. Ο συνολικός χώρος διευθύνσεων στην πραγματική κατάσταση είναι επομένως 220 byte, ή 1 MB, ένα εντυπωσιακό μέγεθος για την εποχή (1978). Όλες οι διευθύνσεις μνήμης αποτελούνται από ένα τμήμα και μια μετατόπιση και κάθε τύπος πρόσβασης (κώδικας, δεδομένα, στοίβα) είχε δικό του καταχωρητή (για δεδομένα ήταν ο DS, για κώδικα ο CS, για στοίβα ο SS). Σε περίπτωση πρόσβασης για δεδομένα, ο καταχωρητής τμήματος μπορεί να είναι οποιοσδήποτε από τους τέσσερις καταχωρητές τμήματος, με χρήση του κατάλληλου προθέματος (segment override prefix). Σύμφωνα με την τεχνική των τμημάτων, δύο διαφορετικά ζεύγη από τμήματα και μετατοπίσεις μπορούν να δείχνουν στην ίδια απόλυτη διεύθυνση. Δηλαδή, αν ο DS είναι A111h και ο SI είναι 4567h, το DS:SI δείχνει στην ίδια διεύθυνση A5677h όπως και το παράδειγμα παραπάνω. Επίσης η τεχνική κάνει αδύνατη την χρήση παραπάνω από τεσσάρων τμημάτων ταυτόχρονα. Ο CS και ο SS είναι πολύ σημαντικοί για την σωστή λειτουργία του προγράμματος, επομένως μόνο ο DS και ο ES μπορούν να χρησιμοποιηθούν για να δείχνουν σε τμήματα με δεδομένα εκτός του προγράμματος (ή, πιο σωστά, εκτός του τμήματος του προγράμματος που εκτελείται αυτήν τη στιγμή) ή εκτός της στοίβας. Στην προστατευμένη κατάσταση (protected mode), ένας καταχωρητής τμήματος δεν περιλαμβάνει πια την φυσική διεύθυνση της αρχής ενός τμήματος, αλλά δείχνει σε μια δομή του συστήματος που ονομάζεται περιγραφέας τμήματος (segment descriptor). Ο περιγραφέας τμήματος περιέχει τη φυσική διεύθυνση της αρχής του τμήματος, το μήκος του τμήματος και τα δικαιώματα πρόσβασης στο τμήμα. Η μετατόπιση ελέγχεται αν είναι μέσα στο μήκος του τμήματος, αν είναι εκτός προκαλείται εξαίρεση (exception). Οι μετατοπίσεις που αναφέρονται σε θέσεις μέσα στο τμήμα συνδυάζονται με τις φυσικές διευθύνσεις στην αρχή του τμήματος για να προκύψει η τελική διεύθυνση που αντιστοιχεί σε αυτήν την μετατόπιση. Η χρήση τμημάτων δυσκολεύει τον προγραμματισμό και την σχεδίαση μεταγλωττιστών γιατί η χρήση κοντινών και μακρινών δεικτών επηρεάζει την ταχύτητα των προγραμμάτων. Οι τρόποι διευθυνσιοδότησης των επεξεργαστών x86 στα 16-bit μπορούν να περιγραφούν περιληπτικά ως εξής: { C S : D S : S S : E S : } [ { B X B P } ] + [ { S I D I } ] + [ μ ϵ τ α τ o ´ π ι σ η ] {\displaystyle {\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\end{Bmatrix}}{\begin{bmatrix}{\begin{Bmatrix}BX\\BP\end{Bmatrix}}\end{bmatrix}}+{\begin{bmatrix}{\begin{Bmatrix}SI\\DI\end{Bmatrix}}\end{bmatrix}}+{\rm {[\mu \epsilon \tau \alpha \tau {\acute {o}}\pi \iota \sigma \eta ]}}} Οι τρόποι διευθυνσιοδότησης για διευθύνσεις μήκους 32-bit σε επεξεργαστές x86 των 32-bit ή των 64-bit μπορούν να περιγραφούν από τον τύπο: { C S : D S : S S : E S : F S : G S : } [ { E A X E B X E C X E D X E S P E B P E S I E D I } ] + [ { E A X E B X E C X E D X E B P E S I E D I } ∗ { 1 2 4 8 } ] + [ μ ϵ τ α τ o ´ π ι σ η ] {\displaystyle {\begin{Bmatrix}CS:\\DS:\\SS:\\ES:\\FS:\\GS:\end{Bmatrix}}{\begin{bmatrix}{\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\ESP\\EBP\\ESI\\EDI\end{Bmatrix}}\end{bmatrix}}+{\begin{bmatrix}{\begin{Bmatrix}EAX\\EBX\\ECX\\EDX\\EBP\\ESI\\EDI\end{Bmatrix}}*{\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}}\end{bmatrix}}+{\rm {[\mu \epsilon \tau \alpha \tau {\acute {o}}\pi \iota \sigma \eta ]}}} Οι τρόποι διευθυνσιοδότησης για κώδικα 64-bit για επεξεργαστές x86 στα 64-bit μπορούν να περιγραφούν από τους εξής τύπους: { : F S : G S : } [ γ ϵ ν ι κ o ´ ς κ α τ α χ ω ρ η τ η ´ ς ] + [ γ ϵ ν ι κ o ´ ς κ α τ α χ ω ρ η τ η ´ ς ∗ { 1 2 4 8 } ] + [ μ ϵ τ α τ o ´ π ι σ η ] {\displaystyle {\begin{Bmatrix}:\\FS:\\GS:\end{Bmatrix}}{\begin{bmatrix}{\rm {\gamma \epsilon \nu \iota \kappa {\acute {o}}\varsigma \;\kappa \alpha \tau \alpha \chi \omega \rho \eta \tau {\acute {\eta }}\varsigma }}\end{bmatrix}}+{\begin{bmatrix}{\rm {\gamma \epsilon \nu \iota \kappa {\acute {o}}\varsigma \;\kappa \alpha \tau \alpha \chi \omega \rho \eta \tau {\acute {\eta }}\varsigma }}*{\begin{Bmatrix}1\\2\\4\\8\end{Bmatrix}}\end{bmatrix}}+{\rm {[\mu \epsilon \tau \alpha \tau {\acute {o}}\pi \iota \sigma \eta ]}}} και R I P + [ μ ϵ τ α τ o ´ π ι σ η ] {\displaystyle RIP+{\rm {[\mu \epsilon \tau \alpha \tau {\acute {o}}\pi \iota \sigma \eta ]}}} Ο δεύτερος τύπος διευθυνσιοδότησης για κώδικα 64-bit (σε σχέση με τον καταχωρητή RIP, που είναι ο δείκτης εντολής, instruction pointer) διευκολύνει την υλοποίηση κώδικα που δεν εξαρτάται από τις θέσεις μνήμης (όπως οι κοινές βιβλιοθήκες σε κάποια λειτουργικά συστήματα). Ο 8086 είχε 64 KB από χώρο 8-bit (ή εναλλακτικά 32 K-λέξεις των 16-bit) για είσοδο/έξοδο και 64 KB (ένα τμήμα) στοίβας μνήμης με υποστήριξη υλικού. Στη στοίβα μπορούσαν να τοποθετηθούν μόνο λέξεις (2 byte). Η στοίβα μεγάλωνε προς τα κάτω (προς αριθμητικά μικρότερες διευθύνσεις), με το SS:SP να δείχνει στο κάτω άκρο της. Υπήρχαν 256 διακοπές (interrupts), οι οποίες μπορούσαν να κληθούν από το υλικό ή το λογισμικό. Οι διακοπές αυτές μπορούσαν να είναι διαδοχικές, χρησιμοποιώντας την στοίβα για να αποθηκεύουν την διεύθυνση επιστροφής τους. Για πληροφορίες σχετικά με τους καταχωρητές των επεξεργαστών, δείτε Καταχωρητής επεξεργαστή. Ο αρχικός 8086 και ο 8088 έχουν δεκατέσσερις καταχωρητές των 16-bit. Από αυτούς οι τέσσερις (AX, BX, CX, DX) είναι γενικής χρήσης (αν και ο καθένας μπορεί να έχει επιπλέον ρόλους, για παράδειγμα μόνο ο CX μπορεί να χρησιμοποιηθεί ως μετρητής στην εντολή επανάληψης loop). Καθένας τους μπορεί να διαβαστεί σαν δύο ξεχωριστά byte (για παράδειγμα, το υψηλότερο byte του BX ονομάζεται BH και το χαμηλότερο byte BL). Υπάρχουν δύο καταχωρητές δεικτών: ο SP που δείχνει στην κορυφή της στοίβας (Stack Pointer) και ο BP που δείχνει σε κάποιο άλλο σημείο της στοίβας (Base Pointer), συνήθως πιο πάνω από τις τοπικές μεταβλητές. Δύο καταχωρητές, ο SI και ο DI, χρησιμοποιούνται ως δείκτες σε πίνακες. Για τον σχηματισμό διευθύνσεων μνήμης χρησιμοποιούνται τέσσερις καταχωρητές (CS, DS, SS και ES). Ο καταχωρητής FLAGS περιέχει σημαίες (flags), όπως το υπόλοιπο (carry), η υπερχείλιση (overflow) και ο έλεγχος για μηδέν. Τέλος, ο δείκτης εντολής (instruction pointer, IP) δείχνει στην επόμενη εντολή που θα διαβαστεί από τη μνήμη και θα εκτελεστεί. Στον Intel 80286 υπάρχουν τρεις επιπλέον καταχωρητές που κρατούν διευθύνσεις πινάκων από περιγραφείς (GDTR, LDTR, IDTR) και ένας τέταρτος καταχωρητής εργασιών (task register, TR). Με την εμφάνιση του επεξεργαστή 32-bit 80386, οι καταχωρητές γενικής χρήσης, οι καταχωρητές βάσης, οι καταχωρητές δεικτών, ο δείκτης εντολής και ο καταχωρητής FLAGS, που ήταν 16-bit, επεκτάθηκαν στα 32 bit (αυτό όμως δεν συνέβη και για τους καταχωρητές τμήματος). Αυτό αναπαριστάται με ένα πρόθεμα "E" (από την αγγλική λέξη Extended που δείχνει την επέκταση) μπροστά από τα ονόματα των καταχωρητών στη συμβολική γλώσσα του x86. Επομένως, ο καταχωρητής AX αντιστοιχεί στα κατώτερα 16 bit του νέου καταχωρητή EAX που είναι 32-bit, ο SI αντιστοιχεί στα κατώτερα 16 bit του ESI, κοκ. Οι καταχωρητές γενικής χρήσης, οι καταχωρητές βάσης και οι καταχωρητές δείκτη μπορούν να χρησιμοποιηθούν σαν βάση στους διάφορους τρόπους διευθυνσιοδότησης, ενώ όλοι οι καταχωρητές εκτός από τον καταχωρητή στοίβας μπορούν να χρησιμοποιηθούν σαν δείκτες στο σχημαστισμό διευθύνσεων. Προστέθηκαν επίσης δύο νέοι καταχωρητές τμήματος (FS και GS). Λόγω του αυξημένου αριθμού των καταχωρητών, των εντολών και των τελεστέων, χρειάστηκε επέκταση της μορφής του κώδικα μηχανής. Για να διατηρηθεί η συμβατότητα, τα τμήματα με εκτελέσιμο κώδικα μπορούν να σημειωθούν ανάλογα με το αν περιέχουν εντολές 16-bit ή 32-bit. Ειδικά προθέματα επιτρέπουν σε εντολές 32-bit να υπάρχουν σε ένα τμήμα 16-bit και αντίστροφα. Στον 80486 προστέθηκε Μονάδα Κινητής Υποδιαστολής (FPU), με οχτώ καταχωρητές 80-bit.Στον Pentium II προστέθηκαν οχτώ καταχωρητές ακεραίων MMX 64-bit (MMX0..MMX7, που μοιράζονται τα κατώτερα bit με τη στοίβα της μονάδας κινητής υποδιαστολής που είναι 80-bit (st(0)..st(7))). Στον Pentium III προστέθηκαν ένας καταχωρητής ελέγχου κατάστασης των 32-bit (control/status register, MXCSR) για το σύνολο εντολών Streaming SIMD Extension (SSE) και οχτώ καταχωρητές SSE των 128-bit για αριθμούς κινητής υποδιαστολής (XMM0..XMM7). Από τον επεξεργαστή AMD Opteron και μετά, η αρχιτεκτονική x86 επέκτεινε τους καταχωρητές από 32 bit σε 64 bit με παρόμοιο τρόπο με την επέκταση από τα 16 στα 32-bit προστατευμένης κατάστασης (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, RFLAGS, RIP), ενώ προστέθηκαν οχτώ επιπλέον γενικοί καταχωρητές 64-bit (R8, R9..R15) με την δημιουργία του x86-64. Οι επεκτάσεις αυτές όμως μπορούν να χρησιμοποιηθούν μόνο στην κατάσταση 64-bit, που είναι η μια από τις δύο καταστάσεις που είναι διαθέσιμες σε μακρά κατάσταση (long mode). Οι τρόποι σχηματισμού διευθύνσεων δεν άλλαξαν σημαντικά σε σχέση με την κατάσταση 32-bit, μόνο οι διευθύνσεις επεκτάθηκαν στα 64 bit, ενώ οι εικονικές διευθύνσεις επεκτείνονται (μαζί με το πρόσημό τους) στα 64 bit. Επιπλέον προστέθηκε μια κατάσταση σχηματισμού διευθύνσεων για αναφορές στη μνήμη σε σχέση με τον καταχωρητή RIP (τον δείκτη εντολής), για τη διευκόλυνση της υλοποίησης κώδικα που να είναι ανεξάρτητος από την τοποθέτησή του (position-independent code), ο οποίος χρησιμοποιείται σε διαμοιραζόμενες βιβλιοθήκες σε κάποια λειτουργικά συστήματα. Οι επεξεργαστές x86 (αρχίζοντας από τον 80386) περιλαμβάνουν επίσης κάποιους ειδικούς καταχωρητές όπως οι καταχωρητές ελέγχου (CR0 έως 4, CR8 μόνο στα 64-bit), καταχωρητές αποσφαλμάτωσης (DR0 έως 3, επιπλέον 6 και 7), οι καταχωρητές δοκιμών (TR3 έως 7, μόνο στον 80486), οι καταχωρητές περιγραφέων (GDTR, LDTR, IDTR), ο καταχωρητής εργασιών (TR) και οι διάφοροι ειδικοί καταχωρητές κάθε μοντέλου (model-specific registers ή MSRs, αρχίζοντας από τον Pentium). Αν και οι βασικοί καταχωρητές (εκτός του δείκτη εντολής) είναι "γενικής χρήσης" και μπορούν να χρησιμοποιηθούν για οτιδήποτε, αρχικά προτάθηκε η εξής χρήση τους: AX/EAX/RAX: συσσωρευτής (Accumulator) BX/EBX/RBX: δείκτης βάσης (Base index), για παράδειγμα σε πίνακες CX/ECX/RCX: μετρητής (Counter) DX/EDX/RDX: δεδομένα (Data)/γενική χρήση SI/ESI/RSI: δείκτης πηγής (Source Index) για λειτουργίες με συμβολοσειρές DI/EDI/RDI: δείκτης προορισμού (Destination Index) για λειτουργίες με συμβολοσειρές SP/ESP/RSP: δίκτης στοίβας (Stack Pointer) που δείχνει στο πάνω μέρος της στοίβας BP/EBP/RBP: δείκτης βάση στοίβας (Stack Base Pointer) που δείχνει στη διεύθυνση του τρέχοντος πλαισίου στοίβας IP/EIP/RIP: δείκτης εντολής (Instruction Pointer) - κρατάει το μετρητή προγράμματος (program counter), που δείχνει στην τρέχουσα εντολή.Δεν προτάθηκαν κάποιες ιδιαίτερες χρήσεις για τους άλλους 8 καταχωρητές που είναι διαθέσιμοι στην κατάσταση 64-bit. Κάποιες εντολές μεταγλωττίζονταν και εκτελούνταν γρηγορότερα όταν χρησιμοποιούσαν τους καταχωρητές ανάλογα με τις παραπάνω χρήσεις. Για παράδειγμα, αν χρησιμοποιηθεί ο AL σαν συσσωρευτής για να προστεθεί μια απευθείας τιμή τύπου byte σε αυτόν, προκύπτει η γρήγορη εντολή 04h (πρόσθεση στον AL), ενώ αν χρησιμοποιηθεί ο καταχωρητής BL προκύπτει η γενική (δηλ. όχι εξειδικευμένη) εντολή 80C3h. Άλλο παράδειγμα είναι η διαίρεση διπλής ακρίβειας και ο πολλαπλασιασμός που λειτουργούν με τους καταχωρητές AX και DX. Οι σύγχρονοι μεταγλωττιστές εκμεταλλεύονται το byte sib ("scaled index byte") που επιτρέπει τον ομοιόμορφο χειρισμό των καταχωρητών. Κάποιες ειδικές εντολές έχασαν την προτεραιότητά τους στη σχεδίαση υλικού και έγιναν πιο αργές σε σχέση με ισοδύναμες σύντομες ακολουθίες εντολών, όπως η εντολή LODSW. Καταχωρητές Γενικής Χρήσης (A, B, C και D) Καταχωρητές Τμημάτων (C, D, S, E, F και G) Καταχωρητές Δείκτη (S και B) Σημείωση: Οι καταχωρητές ?PL είναι διαθέσιμοι μόνο στην κατάσταση 64-bit. Καταχωρητές Σχετικού Δείκτη (S και D) Σημείωση: Οι καταχωρητές ?IL είναι διαθέσιμοι μόνο στην κατάσταση 64-bit. Καταχωρητής Δείκτη Εντολής (I) Καταχωρητές Γενικής Χρήσης κατάστασης 64-bit (R8, R9, R10, R11, R12, R13, R14, R15) Η πραγματική κατάσταση (real mode) είναι κατάσταση λειτουργίας του 8086 και των μεταγενέστερων επεξεργαστών που είναι συμβατοί με τον x86. Η πραγματική κατάσταση έχει χώρο διευθύνσεων μνήμης χωρισμένο σε τμήματα 20 bit (επομένως οι διευθύνσεις μπορούν να αναφέρονται μόνο σε 1 MB μνήμης), η πρόσβαση του λογισμικού τις ρουτίνες του BIOS και στα περιφερειακά του υλικού είναι απευθείας και δεν υπάρχουν οι έννοιες της προστασίας μνήμης ή της πολυεπεξεργασίας στο επίπεδο του υλικού. Όλοι οι επεξεργαστές x86 της σειράς 80286 και έπειτα εκκινούν σε πραγματική κατάσταση, ενώ οι 80186 και οι προηγούμενοι επεξεργαστές είχαν μόνο μια κατάσταση, που αντιστοιχούσε στην πραγματική κατάσταση των μεταγενέστερν τσιπ. Για να γίνει χρήση περισσότερων από 64 KB μνήμης, πρέπει να χρησιμοποιηθούν οι καταχωρητές τμήματος. Αυτό περιέπλεξε την κατάσταση για την υλοποίηση μεταγλωττιστών, όπου χρειάστηκε να χρησιμοποιηθούν ειδικές καταστάσεις δεικτών, όπως η "κοντινή" ("near"), η "μακρινή" ("far") και η "μεγάλη" ("huge"), ώστε να προσαρμοστούν στο μοντέλο της αρχιτεκτονικής με τμήματα, με κάποιους δείκτες να περιέχουν μετατοπίσεις 16-bit σε έμμεσα δηλωμένα τμήματα, ενώ άλλοι περιείχαν διευθύνσεις τμημάτων και μετατοπίσεις μέσα σε τμήματα. Εκτός από την πραγματική κατάσταση ο Intel 80286 υποστήριζε την προστατευμένη κατάσταση (protected mode), που επέκτεινε την φυσική μνήμη που μπορούσε να αναφερθεί μέσω διευθύνσεων σε 16 MB και την εικονική μνήμη (virtual memory) σε 1 GB, ενώ παρείχε προστατευμένη μνήμη (protected memory), η οποία εμπόδιζε ένα πρόγραμμα να επηρεάζει τα υπόλοιπα. Αυτό ήταν δυνατό επειδή οι καταχωρητές τμημάτων χρησιμοποιούνταν μόνο σαν δείκτες σε έναν πίνακα από τμήματα. Υπήρχαν δύο τέτοιοι πίνακες, ο Καθολικός Πίνακας Περιγραφέων (Global Descriptor Table, GDT) και ο Τοπικός Πίνακας Περιγραφέων (Local Descriptor Table, LDT), ο καθένας από τους οποίους μπορούσε να έχει μέχρι 8192 περιγραφείς τμημάτων, με κάθε τμήμα να παρέχει πρόσβαση σε μνήμη μεγέθους 64 KB. Ο πίνακας τμημάτων έδινε μια διεύθυνση βάσης (base address) των 24-bit, η οποία μπορούσε να προστεθεί σε κάποια μετατόπιση για να προκύψει μια απόλυτη διεύθυνση. Σε κάθε τμήμα μπορούσε να δοθεί ένα επίπεδο ασφάλειας (ring level), από ένα σύνολο τεσσάρων τέτοιων επιπέδων, για ασφάλεια σε επίπεδο υλικού. Ο Intel 80386 υποστήριξε πρώτος τις σελίδες (paging) στην προστατευμένη κατάσταση, που επέτρεπαν τη χρήση εικονικής μνήμης με σελίδες. Οι σελίδες χρησιμοποιούνται εκτενώς στα σύγχρονα λειτουργικά συστήματα με δυνατότητες πολυδιεργασίας. Τα λειτουργικά συστήματα Linux, 386BSD και Windows NT αναπτύχθηκαν στον 386 γιατί ήταν η πρώτη αρχιτεκτονική επεξεργαστή της Intel που υποστήριζε σελίδες και μετατοπίσεις τμημάτων 32-bit. Η αρχιτεκτονική του 386 έγινε η βάση για την περαιτέρω ανάπτυξη της σειράς x86. Οι επεξεργαστές x86 που υποστηρίζουν προστατευμένη κατάσταση εκκινούν σε πραγματική κατάσταση για να είναι συμβατοί με τους προηγούμενους επεξεργαστές τύπου 8086. Όταν ο επεξεργαστής αρχίζει να λειτουργεί (booting), αρχικοποιεί την πραγματική κατάσταση και αρχίζει να εκτελεί εντολές. Ο κώδικας εκκίνησης του λειτουργικού συστήματος, ο οποίος μπορεί να βρίσκεται σε μνήμη ανάγνωσης (ROM), μπορεί να βάλει τον επεξεργαστή σε προστατευμένη κατάσταση για να είναι διαθέσιμες οι σελίδες και τα άλλα επιπλέον χαρακτηριστικά. Το σύνολο εντολών της προστατευμένης κατάστασης είναι συμβατό με αυτό της πραγματικής κατάστασης. Εικονική κατάσταση 8086 Υπάρχει επίσης μια ειδική κατάσταση της προστατευμένης κατάστασης 32-bit, που ονομάζεται εικονική κατάσταση 8086 (virtual 8086 mode). Πρόκειται για μια ειδική υβριδική κατάσταση λειτουργίας που επιτρέπει σε προγράμματα και λειτουργικά συστήματα πραγματικής κατάστασης να εκτελούνται κάτω από τον έλεγχο ενός λειτουργικού συστήματος προστατευμένης μνήμης που έχει το ρόλο του επόπτη (supervisor). Αυτό επιτρέπει την ταυτόχρονη εκτέλεση προγραμμάτων προστατευμένης κατάστασης και πραγματικής κατάστασης. Η κατάσταση αυτή είναι διαθέσιμη μόνο στις εκδόσεις 32-bit της προστατευμένης κατάστασης - η εικονική κατάσταση 8086 δεν υπάρχει στην έκδοση 16-bit της προστατευμένης κατάστασης, ή στην μακρά κατάσταση. Το 2002 ήταν πια προφανές ότο ο χώρος διευθύνσεων 32-bit της αρχιτεκτονικής x86 περιόριζε την ταχύτητά της σε εφαρμογές που χειρίζονταν μεγάλους όγκους δεδομένων. Ένας χώρος διευθύνσεων 32-bit επέτρεπε στον επεξεργαστή να αναφερθεί απευθείας μέσω διευθύνσεων μόνο σε 4 GB δεδομένων, που ήταν μικρό μέγεθος για τις ανάγκες της επεξεργασίας βίντεο και των βάσεων δεδομένων, ενώ η χρήση διευθύνσεων 64-bit επέτρεπε την αναφορά σε 16,777,216 TB (ή 16 δισεκατομμύρια GB) δεδομένων, αν και οι περισσότερες αρχιτεκτονικές 64-bit δεν υποστηρίζουν πρόσβαση σε όλον τον χώρο διευθύνσεων των 64-bit (η AMD64, για παράδειγμα, υποστηρίζει μόνο 48 bit, χωρισμένα σε 4 επίπεδα σελίδων, μιας διεύθυνσης 64-bit). Η AMD ανέπτυξε την επέκταση της αρχιτεκτονικής x86 από 32-bit σε 64-bit, η οποία χρησιμοποιείται σήμερα στους επεξεργαστές x86, αρχικά με το όνομα x86-64, και αργότερα σαν AMD64. Η αρχιτεκτονική αυτή χρησιμοποιείται από τις οικογένειες επεξεργαστών Opteron, Athlon 64, Turion 64 και τα μεταγενέστερα μοντέλα των Sempron. Η επιτυχία των επεξεργαστών AMD64, σε συνδυασμό με την πειρορισμένη αποδοχή της αρχιτεκτονικής IA-64 έκανε την Intel να κυκλοφορήσει την δική της υλοποίηση του συνόλου εντολών AMD64. Η Intel είχε ήδη υλοποιήσει υποστήριξη για AMD64 αλλά είχε επιλέξει να μην την ενεργοποιήσει, ελπίζοντας ότι η AMD δεν θα προλάβαινε να κυκλοφορήσει τους AMD64 πριν εδραιωθεί το νέο σύνολο εντολών IA-64 του Itanium. Αρχικά αποκαλούσε την υλοποίηση της επέκτασης AMD64 σαν EM64T, και στη συνέχεια σαν Intel 64. Στα έγγραφά τους και στα ονόματα των προϊόντων τους, η Microsoft και η Sun αναφέρονται στους AMD64/Intel 64 συνολικά σαν x64, όσον αφορά τα λειτουργικά συστήματα Windows and Solaris αντίστοιχα. Οι διανομές του Linux τους αποκαλούν είτε σαν "x86-64" (ή "x86_64"), είτε σαν "amd64". Τα συστήματα BSD χρησιμοποιούν τον όρο "amd64" ενώ το Mac OS X χρησιμοποιεί τον όρο "x86_64". Η μακρά κατάσταση είναι κυρίως μια επέκταση του συνόλου εντολών 32-bit, αλλά σε αντίθεση με τη μετάβαση από τα 16 στα 32 bit, πολλές εντολές αφαιρέθηκαν από την κατάσταση 64 bit. Αυτό δεν επηρεάζει την πραγματική δυαδική συμβατότητα των προγραμμάτων (τα παλιά προγράμματα μπορούν να εκτελεστούν σε άλλες καταστάσεις, που ακόμα υποστηρίζουν τις παλιές εντολές) αλλά αλλάζει τον τρόπο που πρέπει να λειτουργούν οι συμβολομεταφραστές και οι μεταγλωττιστές του νέου κώδικα. Αυτή ήταν η πρώτη φορά που μια σημαντική επέκταση της αρχιτεκτονικής x86 ξεκίνησε από άλλη εταιρεία από την Intel. Ήταν επίσης η πρώτη φορά που η Intel υιοθέτησε τεχνολογία τέτοιου τύπου από εξωτερική πηγή. Δείτε επίσης: Μονάδα Κινητής ΥποδιαστολήςΟι πρώτοι επεξεργαστές x86 μπορούσαν να επεκταθούν με υλικό για αριθμητική κινητής υποδιαστολής (floating-point), το οποίο ήταν μια σειρά από αριθμητικούς συνεπεξεργαστές με ονόματα του τύπου 8087, 80287 και 80387. Με λίγες εξαιρέσεις, από τον 80486 και έπειτα, οι επεξεργαστές x86 ενσωμάτωσαν αυτήν την λειτουργικότητα x87 στο ίδιο το τσιπ, κάτι που έκανε τις εντολές του x87 ντε φάκτο μέρος του συνόλου εντολών x86. Οι καταχωρητές του x87, έχουν ονόματα ST(0) έως ST(7), είναι 80 bit και αποθηκεύουν αριθμούς σύμφωνα με το πρότυπο κινητής υποδιαστολής διπλής εκτεταμένης ακρίβειας του IEEE. Οι καταχωρητές αυτοί οργανώνονται σαν στοίβα με τον ST(0) στην κορυφή της στοίβας. Αυτό έγινε ώστε να εξοικονομηθεί χώρος εντολών και έτσι οι καταχωρητές είναι άμεσα προσβάσιμοι μόνο στις αριθμητικές εντολές που χειρίζονται αποκλειστικά καταχωρητές: ο ST0 πρέπει πάντα να είναι το ένας από τους δύο τελεστέους, είτε η πηγή, είτε ο προορισμός, ανεξάρτητα από τον άλλο τελεστέο, που μπορεί να είναι ένας καταχωρητής ST(x) ή μια αναφορά στην μνήμη. Το MMX είναι σύνολο εντολών SIMD που σχεδιάστηκε από την Intel και κυκλοφόρησε πρώτη φορά το 1997 για τον μικροεπεξεργαστή Pentium MMX. Το σύνολο εντολών MMX αναπτύχθηκε με βάση μια παρόμοια ιδέα που ήδη είχε χρησιμοποιηθεί στον Intel i860. Υποστηρίζεται στους περισσότερους επεξεργαστές IA-32 που ακολούθησαν, από την Intel και από άλλες εταιρείες. Το MMX συνήθως χρησιμοποιείται για εφαρμογές πολυμέσων, όπως η επεξεργασία βίντεο. Το MMX πρόσθεσε 8 νέους "καταχωρητές" στην αρχιτεκτονική, γνωστούς με τα ονόματα από MM0 έως MM7 (στο εξής θα αποκαλούνται MMn). Στην πραγματικότητα, αυτοί οι νέοι "καταχωρητές" ήταν απλά ονόματα που έδειχναν στους υπάρχοντες καταχωρητές της στοίβας της μονάδας κινητής υποδιαστολής x87. Έτσι, οτιδήποτε γινόταν στην στοίβα κινητής υποδιαστολής επηρέαζε τους καταχωρητές MMX. Σε αντίθεση με την στοίβα αυτή όμως, οι καταχωρητές MMn δεν ήταν σχετικοί αλλά απόλυτοι και άρα μπορούσαν να χρησιμοποιηθούν ανεξάρτητα. Το σύνολο εντολών δεν είχε σημασιολογία στοίβας και με αυτόν τον τρόπο τα υπάρχοντα λειτουργικά συστήματα μπορούσαν να αποθηκεύουν και να επαναφέρουν τους επεξεργαστές όταν εκτελούσαν παραπάνω από ένα προγράμματα, χωρίς αλλαγές. Κάθε καταχωρητής MMn είναι ένας ακέραιος 64-bit. Μια από τις βασικές ιδέες όμως του συνόλου εντολών MMX ήταν οι τύποι πακεταρισμένων δεδομένων (packed data types), που σήμαινε ότι αντί να χρησιμοποιείται ολόκληρος ο καταχωρητής για έναν ακέραιο των 64-bit (quadword), μπορούσε να χρησιμοποιηθεί για δύο ακεραίους των 32-bit (doubleword), τέσσερις ακεραίους των 16-bit (word) ή οχτώ ακεραίους των 8-bit (byte). Οι καταχωρητές MMn των 64-bit του συνόλου εντολών MMX αποτελούσαν επίσης εναλλακτικά ονόματα για τη στοίβα της μονάδας κινητής υποδιαστολής και κάθε καταχωρητής κινητής υποδιαστολής είχε εύρος 80 bit - αυτό σήμαινε ότι τα ανώτερα 16 bit των καταχωρητών κινητής υποδιαστολής δεν χρησιμοποιούνται από τις εντολές MMX. Σε αυτά τα bit δινόταν πάντα η τιμή ένα από κάθε εντολή MMX, που αντιστοιχούσε στην αναπαράσταση σε κινητή υποδιαστολή της έννοιας δεν-είναι-αριθμός (Not-A-Number, NaN) ή άπειρο. Το 1997 η AMD κυκλοφόρησε την τεχνολογία 3DNow! Χρονικά εμφανίστηκε την ίδια εποχή που άρχισαν να είναι δημοφιλείς οι εφαρμογές γραφικών τριών διαστάσεων (3D) και είχε σχεδιαστεί ώστε να βελτιώσει την ταχύτητα επεξεργασίας διανυσμάτων (vector processing) του επεξεργαστή σε εφαρμογές που έκαναν σημαντική χρήση γραφικών. Οι προγραμματιστές ηλεκτρονικών παιχνιδιών 3D και οι εταιρείες που σχεδίαζαν κάρτες γραφικών και άλλο υλικό για γραφικά 3D χρησιμοποίησαν το 3DNow! για να έχουν καλύτερη απόδοση στους επεξεργαστές K6 και Athlon της AMD. Το 3DNow! σχεδιάστηκε σαν μια φυσική εξέλιξη του MMX από τους ακέραιους στους αριθμούς κινητής υποδιαστολής και χρησιμοποιεί τα ίδια ονόματα καταχωρητών με το MMX, από το MM0 έως το MM7. Η μόνη διαφορά είναι ότι αντί να πακετάρει ακέραιους στους καταχωρητές, πακετάρει δύο αριθμούς κινητής υποδιαστολής απλής ακρίβειας. Το πλεονέκτημα της χρήσης ονομάτων για τους καταχωρητές της μονάδας κινητής υποδιαστολής είναι ότι μπορούν να χρησιμοποιηθούν οι ίδιες εντολές και δομές δεδομένων που αποθηκεύουν την κατάσταση της μονάδας κινητής υποδιαστολής για να αποθηκεύσουν την κατάσταση των καταχωρητών 3DNow! και με αυτόν τον τρόπο δεν χρειάζονται μετατροπές στα λειτουργικά συστήματα (τα οποία δεν χρειάζεται καν να γνωρίζουν για την ύπαρξη της τεχνολογίας αυτής). Το 1999 η Intel κυκλοφόρησε το σύνολο εντολών Streaming SIMD Extensions (SSE) και στη συνέχεια, το 2000, το SSE2. Η πρώτη προσθήκη επέτρεψε σε βασικές λειτουργίες κινητής υποδιαστολής να μην επιβαρύνουν πια την στοίβα του x87 και η δεύτερη έκανε το MMX σχεδόν περιττό αφού επέτρεπε στις εντολές να χρησιμοποιούνται στην πράξη από τους κλασικούς μεταγλωττιστές. Το SSE3 κυκλοφόρησε το 2004 με την έκδοση Prescott των επεξεργαστών Pentium 4 και πρόσθεσε ειδικές εντολές μνήμης και χειρισμού νημάτων ώστε να αυξηθεί η ταχύτητα της τεχνολογίας HyperThreading της Intel. Η AMD αγόρασε δικαιώματα χρήσης του συνόλου εντολών SSE3 και υλοποίησε τις περισσότερες από τις εντολές από την έκδοση E και μετά, στους επεξεργαστές Athlon 64. Ο Athlon 64 δεν υποστηρίζει HyperThreading και άρα δεν έχει τις εντολές SSE3 που χρησιμοποιούνται μόνο για αυτό. Το SSE σταμάτησε να συνδέεται με την στοίβα της μονάδας κινητής υποδιαστολής (FPU), με αποτέλεσμα να μην είναι συμβατό με παλιότερες γενιές συνόλων εντολών SIMD όπως το MMX. Απελευθέρωσε ομως τους σχεδιαστές από τους περιορισμούς των καταχωρητών της FPU, επιτρέποντάς τους να χρησιμοποιούν οχτώ μεγαλύτερους καταχωρητές των 128-bit, με ονόματα XMM0 έως XMM7. (Σημείωση: ο αριθμός τους στον AMD64 έχει αυξηθεί από 8 σε 16.) Το μειονέκτημα αυτής της προσέγγισης ήταν ότι τα λειτουργικά συστήματα έπρεπε να γνωρίζουν για την ύπαρξη του SSE ώστε να μπορούν να σώζουν την κατάσταση των καταχωρητών τους. Έτσι η Intel δημιούργησε μια ελαφρώς τροποποιημένη έκδοση της προστατευμένης κατάστασης, που την ονόμασε enhanced mode, η οποία επιτρέπει την χρήση εντολών SSE, ενώ αυτές είναι απενεργοποιημένες στην κανονική προστατευμένη κατάσταση. Ένα λειτουργικό σύστημα που γνωρίζει για την ύπαρξη του SSE θα μπει σε αυτήν την νέα κατάσταση, ενώ ένα λειτουργικό που δεν την αναγνωρίζει θα μπει μόνο σε προστατευμένη κατάσταση. Το SSE είναι ένα σύνολο εντολών SIMD που λειτουργεί μόνο με τιμές κινητής υποδιαστολής, όπως το 3DNow! αλλά σε αντίθεση με αυτό, δεν είναι συμβατό με τις παλιές χρήσεις της στοίβας της FPU. Έχοντας μεγαλύτερους καταχωρητές από το 3DNow!, το SSE μπορεί να περιέχει διπλάσιο αριθμό από αριθμούς κινητής υποδιαστολής στους καταχωρητές του. Το αρχικό SSE περιοριζόταν σε αριθμούς απλής ακρίβειας, όπως το 3DNow!, ενώ το SSE2 εισήγαγε τη δυνατότητα να πακετάρονται και αριθμοί διπλής ακρίβειας, κάτι που το 3DNow! δε μπορούσε να υποστηρίξει, γιατί ένας αριθμός διπλής ακρίβειας έχει μέγεθος 64-bit και θα χρειαζόταν έναν ολόκληρο καταχωρητή 3DNow! MMn από μόνος του. Με μέγεθος 128 bit, οι καταχωρητές XMMn του SSE μπορούσαν να χωρέσουν δύο αριθμούς κινητής υποδιαστολής διπλής ακρίβειας σε έναν καταχωρητή με αποτέλεσμα το SSE2 να είναι πιο κατάλληλο για επιστημονικούς υπολογισμούς σε σχέση με το SSE1 ή το 3DNow!, τα οποία περιορίζονταν σε αριθμούς απλής ακρίβειας. Το SSE3 δε πρόσθεσε επιπλέον καταχωρητές. Η Επέκταση Φυσικής Διεύθυνσης (Physical Address Extension, PAE) προστέθηκε αρχικά στον Pentium Pro της Intel, για να επιτρέψει επιπλέον 4 bit φυσικών διευθύνσεων στην προστατευμένη κατάσταση 32-bit. Το μέγεθος της μνήμης στην προστατευμένη κατάσταση περιορίζεται συνήθως σε 4 GB. Μέσω κάποιων τεχνικών των συστημάτων διαχείρισης της μνήμης (όσον αφορά τις σελίδες και τα τμήματα), τα λειτουργικά συστήματα για x86 μπορούν να έχουν πρόσβαση σε περισσότερα από 32-bit χώρου διευθύνσεων, ακόμα και χωρίς χρήση της κατάστασης 64-bit. Το μήκος των μετατοπίσεων στα τμήματα και των γραμμικών διευθύνσεων μένει ίδιο, στα 32 bit. δείτε επίσης: ItaniumΤον Απρίλιο του 2003, η AMD κυκλοφόρησε τον πρώτο επεξεργαστή x86 με καταχωρητές φυσικών διευθύνσεων μνήμης 64-bit, οι οποίοι μπορούσαν να αναφερθούν σε πολύ περισσότερη μνήμη από 4 GB χρησιμοποιώντας την νέα επέκταση x86-64 (γνωστή και σαν x64). Η Intel εμφάνισε τον πρώτο της επεξεργαστή x86-64 τον Ιούλιο του 2004. Πριν από τους x86-64 είχε προηγηθεί μια άλλη αρχιτεκτονική που χρησιμοποιούσε διευθύνσεις μνήμης 64-bit: η Intel είχε κυκλοφορήσει τον Itanium το 2001, στοχεύοντας στην αγορά υπολογιστών υψηλών επιδόσεων. Ο Itanium όμως ήταν ασύμβατος με τον x86 και χρησιμοποιείται λιγότερο σήμερα. Οι x86-64 επίσης είχαν το NX bit, το οποίο πρόσφερε κάποια προστασία από σφάλματα ασφάλειας που προκαλούνταν από buffer overruns. Μέχρι πρόσφατα η αρχιτεκτονική x86 δεν ικανοποιούσε τις απαιτήσεις των Popek και Goldberg, οι οποίοι το 1974 είχαν δώσει τις προδιαγραφές της εικονικής εκτέλεσης πολλών λειτουργικών σε μια πλατφόρμα (virtualization). Παρόλα αυτά υπήρξαν διάφορα εμπορικά προϊόντα για "x86 virtualization", όπως το VMware vSphere, το Parallels, το Microsoft Hyper-V Server και το Microsoft Virtual PC. Στην κοινότητα του ανοιχτού κώδικα τα πιο σημαντικά εγχειρήματα virtualization ήταν ο QEMU/KQEMU, το VirtualBox και το Xen. Η Intel και η AMD έχουν κυκλοφορήσει επεξεργαστές x86 με επεκτάσεις virtualization στο υλικό τους, οι οποίες αντιμετωπίζουν τους περιορισμούς της αρχιτεκτονικής x86. Αυτές οι επεκτάσεις είναι γνωστές σαν Intel VT (κωδικό όνομα "Vanderpool") και AMD-V (κωδικό όνομα "Pacifica"). Αν και οι περισσότεροι σύγχρονοι επεξεργαστές x86 περιλαμβάνουν αυτές τις επεκτάσεις, η τεχνολογία θεωρείται ότι ακόμα εξελίσσεται, με πολλές λύσεις σε λογισμικό να είναι γρηγορότερες από αυτές τις λύσεις σε υλικό. This is expected to change as the technology matures Itanium PowerPC Συμβολική γλώσσα x86 Επεξεργαστές της AMD Επεξεργαστές της Intel Επεξεργαστές της VIA Μικροαρχιτεκτονική Rosenblum, Mendel (May, 2005). «Virtual machine monitors: current technology and future trends». IEEE Computer, volume 38, issue 5. http://ieeexplore.ieee.org/iel5/2/30853/01430630.pdf?tp=&isnumber=&arnumber=1430630. 25 Years of Intel Architecture x86 CPUs guide Αρχειοθετήθηκε 2007-02-23 στο Wayback Machine.