Home Computer x86 Prozessoren Site Map counter

Der 8086

In einer losen Reihe will ich die Hardwareentwicklung der x86 Architektur bis zum Haswell nachvollziehen. Danach wird es für den Autor relativ schwer, weil zum einen Intel seine Produktpalette sehr stark erweiterte, zum anderen die Firma die Entwicklungszyklen aufspaltete in einen Teil, in dem man die Architektur erweitert und einem in dem man mehr Transistoren unterbringt, also die Herstellungstechnologie ändert. Dadurch gibt es nicht mehr eine "Generation" mit definierten Eigenschaften mehr.

Heute geht es um den Urvater aller heutigen PC, den Intel 8086.

Intel 8086-2Der 8086 war nicht der erste verfügbare 16-Bit-Mikroprozessor. Schon vorher erschien der TMS 9900 als erster 16 Bit Mikroprozessor in einem Gehäuse. Er war kompatibel zu den Minicomputern der Reihe 990 von Texas Instruments und wurde im Ti 99/4 Heimcomputer verwendet. Intel hatte Mitte bis Ende der siebziger Jahre Erfolg mit ihren 8 Bit Prozessoren 8080 und 8085. Auf ihnen basierte der Altair 8800. Allerdings verlor die Firma Marktanteile, als Rechner auf Basis des 6502 und Z80 Prozessors erschienen. Der Erstere war deutlich preiswerter, der Zweite kompatibel zum 8080 und leistungsfähiger.

Angekündigt war von Motorola der MC 68000 Prozessor, der 1979 erscheinen sollte und Intel bemerkte, dass viele Hardwarehersteller auf diesen Chip warteten. Der MC 68000 war ein Prozessor der intern schon mit 32 Bit arbeitete, alle Anschlüsse aber nur 16-Bittig hatte und daher auch als 32/16 Bit Prozessor bezeichnet wird. Intel reagierte darauf, indem sie sehr schnell (angeblich in nur wenigen Wochen) einen Prozessor schufen, der vor dem MC68000 erscheinen sollte. Damit sollte er Kunden binden, bevor er durch den MC68000 leistungsmäßig überlegene Konkurrenz bekam. Weiterhin war ein wichtiges Verkaufs- und Designargument, das seine Architektur kompatibel zum existierenden 8080 zur Quellcodeebene war. Es gab von Intel drei Programme, die 8080 Assembler und Maschinencode automatisch in 8086 Code übersetzen konnten. Intel wollte keinen Bruch, da schon beim Übergang von dem 8008 auf den 8080 die Codekompatibilität sehr wichtig war. So war auch die Architektur ähnlich. Es gab die gleiche Zahl an Allgemeinen Registern und wie beim Vorgänger konnte man ein 16 Bit Register in zwei 8 Bit Register aufteilen.

Der 8086 war nur als Zwischenlösung geplant, wie auch seine Nummer, gerade mal um 1 höher als beim B-Bit-Prozessor 8085, verrät. Intel startete 1979 die Entwicklung eines neuen 32 Bit Prozessors, der Motorolas MC68000 deutlich überlegen sein sollte. Der seit 1975 entwickelte und über 100 Mannjahre verschlingende Prozessor hieß ursprünglich I8800. Intel sah wir schnell Mikroprozessoren den Markt eroberten. Sie konnten aber noch lange nicht mit den Minicomputern oder Großrechnern mithalten. Eine 32 Bit Implementierung würde dies können und so sollte der I8800 Fähigkeiten haben, die man bei einem Großrechner hat, dort aber in der Regel vom Betriebssystem wahrgenommen werden. Dazu gehört der Speicherschutz (Schutz vor ungewollten Änderungen von Speicherbereichen, eine derartige Technik wurde 30 Jahre später als "NX-Bit" bei der X86 Linie eingeführt).  Dazu kam die Unterstützung für mehrere Tasks Präempetives Multitasking und für objektorientierte Datenstrukturen. Es war der Versuch einen Prozessor zu bauen der typische Eigenschaften eines Betriebssystems für größere Rechner in der Hardware ausführt. Dieser Ansatz scheiterte. Der Prozessor hatte als er 1981 erschien (inzwischen in iAPX 432 umbenannt) eine sehr schlechte Performance. Er war nur etwas schneller als der 8086, langsamer als der MC68000 oder kurz danach erschienene Intel 80286. Das lag zum einen daran das Compiler ineffizienten Code erzeugten z.B. langsame Befehle die für Taskswitches geplant waren für normale Prozeduraufrufen innerhalb desselben Tasks nutzten. Zum anderen wurde der Chip so komplex, das Intel ihn nicht auf einem Prozessor unterbringen konnte. Es gab zwei Chips für die Ausführung. Der eine holte die Anweisungen und dekodierte sie, die zweite führte sie aus. Ein dritter Chip war für die Ein/Ausgaben auf den Bus notwendig. Diese drei Chip Lösung war naturgemäß langsamer als eine Einchiplösung. Der Chip sollte aus 250.000 Elementen oder 146.000 Transistoren bestehen. Der MC68000 hatte dagegen nur 68.000 Elemente und 40.0000 Transistoren. Nachdem der Chip 1981 als er veröffentlicht wurde scheiterte, musste der 8086 nun dafür sorgen, das Intel nicht den 16- und 32-Bit Markt an die Konkurrenz verlor, denn einen weiteren Prozessor hatte man nicht in der Entwicklung.

8086 Aufbau 1Der 8086 bestand intern aus zwei Einheiten. Das eine war die Bus Interface Unit (BIU) und das Zweite die Execution Unit (EU). Die BIU holte die Instruktionen und las und schrieb Daten aus dem Speicher. Sie berechnete die effektive Adresse und hatte dazu vier Segmentregister und den Instruktion Pointer (IP). Der auf den Bereich im Speicher zeigt, wo die nächste Anweisung stand. Eine Queue von 6 Bytes Länge nahm den Befehl auf. Befehle wurden byteweise geholt, nur für Daten wurde der 16 Bit Zugriff genutzt. Die EU decodierte den Befehl und führte ihn aus. In ihr saßen der Befehlsdekoder und die Arithmetisch-logische Einheit (ALU). In ihr waren auch die allgemein nutzbaren Register AX - DX und vier Register die Gegenstücke zu den Segmentregistern in der BIU waren, untergebracht.

Die Adressierung des Speichers war eine der Merkwürdigkeiten und Limitationen des 8086. Ein 16-Bit-Prozessor hat 16 Bit breite Register. Damit kann man nur 64 KByte adressieren (128 KByte, wenn die Adressierung nicht Byte, sondern 16-Bit-weise = wortweise) erfolgt. Das ist wenig. Daher hatten schon 8 Bit Prozessoren für den Zugriff auf Adressen 16 Bit breite Register oder man konnte zwei 8 Bit Register zu einem 16-Bit-Register zusammenfassen. Andere 16 Bit Prozessoren setzten daher auf Register für die Adressierung von 24 oder 32 Bit Breite und verarbeiteten nur Daten mit 16 Bit Breite.

Beim Intel 8086 löste man das Problem dadurch, dass eine Adressangabe aus zwei Registern bestand: einem 16 Bit breiten Segmentregister und einem 16 Bit breiten Offsetregister. Es gab je 4 Register für 4 Segmente und Offset in der BIU und EU. Die Adresse wurde berechnet, indem man den Wert des Registers in der BIU mit 16 multiplizierte und den Wert des Registers in der EU addierte. Als Folge konnte man die vier Segmente in Schritten von 16 Bytes über den ganzen Adressbereich von 1 MByte verschieben. Ohne Anpassungen der Segmentregister waren so nur 256 KByte adressierbar. Wer genau aufpasst, stellt fest, dass es da einen Bug gibt, denn durch die Addition kann man mehr als 1 MByte Speicher ansprechen. In der Tat konnte der 8086 so 65520 Bytes oberhalb der 1 MByte Grenze adressieren. (65535*16+65535). Der 8086 schnitt diese Bytes beim Zugriff ab. Frühe DOS Versionen ließen es auch zu, dass man Segmentregister so setzen konnte, dass sie über 1 MByte hinausragten. Als der 80286 erschien, der 16 MByte adressieren konnte, musste man eine Schaltung einfügen, die die 20-ste Adressleitung (die erste über 1 MByte) auf logisch "0" setzte und so einen 8086 emulierte, sonst wäre der IBM PC/AT nicht kompatibel zum IBM PC gewesen. Spätere DOS Versionen nutzen diesen oberen Bereich „Himem“ um dort Treiber abzulegen, weil DOS bis zur letzten Version nur 1 MByte Speicher ansprechen konnte, selbst wenn der Rechner erheblich mehr Speicher hatte. Dieses Provisorium hat sich gehalten. Erst 2009 erschienen die ersten Prozessoren ohne "A20 Gate".

DieDie Segmentierung des Speichers gehorchte Regeln. Zwei Segmentregister waren an wichtige Register gebunden. Das CS-Register an den IP. Über CS:IP wurden die Befehle geholt. Das SS-Register an den Stackpointer, mit dem Parameter und Rücksprungadressen ablegt wurden. Für Daten standen die beiden Segmentregister DS und ES zur Verfügung, verwendet wurde meist DS (Datasegment). Das ES (Extrasegement) wurde eher seltener genutzt. Damit waren Datenstrukturen z.B. Felder oder Texte auf 64 KByte Größe beschränkt. Man konnte leicht die Codesegmente auswechseln, weil Code aus vielen kleinen Routinen besteht, aber Daten werden meist sequenziell und als Ganzes abgearbeitet und so waren die meisten Programme ohne aufwendige Tricks auf maximal 64 KByte große Daten beschränkt oder man teilte größere Daten per Programm in 64 KByte große Happen auf. In jedem Falle verkomplizierte es die Berechnungen. Einen Nutzen in dem Sinne, dass man z.B. das Datensegment nicht zum Ausführen von Code nutzen konnte (selbstmodifizierende Programme, typischerweise Viren), gab es beim 8086 noch nicht.

Für allgemeine Rechnungen waren nur vier der Register gedacht: AX, BX, CX und DX. Dies war für einen 16 Bit Prozessor wenig. Konkurrenzprodukte hatten 8 oder 16 allgemein nutzbare Register. Man konnte sie dafür in zwei Teilen ansprechen, die dann jeweils ein Byte aufnahmen. Beim AX-Register hießen diese AH und AL (H für High und L für Low, entsprechend den oberen oder unteren 8 Bits). Analog gab es für noch die Register BL, BH, CL, CH, DL und DH. Da es auch Befehle für diese byteweisen Zugriffe gab, war die Architektur in dieser Hinsicht kompatibel zum 8080 bei dem es die Register A, B, C, D, E, H und L gab, die auch für bestimmte Befehle zusammenfasst werden konnten zu BC, DE und HL So war es ein leichtes, auch die Maschinenbefehle zu übernehmen. Man musste nur die Werte aller drei Segmentregister auf dieselbe Basisadresse setzen und man hatte den 64 KByte adressraum des 8080. Diese Kompatibilität war Anfangs ein großes Pius, denn so war es einfach möglich, bestehende Programme für den 8086 zu übersetzen. MS-DOS entwickelte sich aus der Kopie von CP/M 80, das für den 8080 Prozessor geschrieben war und CP/M 86 entstand ähnlich. Die ersten Programme für beide Betriebssysteme entstanden durch einfaches maschinelles Übersetzen existierender CP/M Programme.

Was auf den ersten Blick wie eine clevere Lösung aussieht um Software zu migrieren entpuppt sich im geschichtlichen Rückblick als eine Sackgasse. MS-DOS als Betriebssystem für den IBM PC und seine Nachbauten begann als Kopie von CP/M 80, dem Betriebssystem für den 8080 Prozessor. Die erste Version MS DOS 1.X konnte auch nur 64 Kbyte RAM nutzen. Später konnte man sich von diesem Adressierungsmodus der maximal 1 Megabyte Speicher und maximal 64 Kilobyte am Stück zu lies nicht mehr lösen. Selbst die letzte MS-.DOS Version die 1994 erschien tat so als wäre im Rechner ein 8086, obwohl der zu dieser Zeit gar nicht mehr produziert wurde, Versuche ein besseres Betriebssystem zu etablieren wie OS/2 oder Concurrent CP/M scheiterten an der Forderung nach 100% MS-DOS Komptabilität. Die 8 Bit Befehle verbrauchten eine Menge an Opcodes ohne das man einen Nutzen davon hatte, denn meistens waren zu verarbeitende Zahlen größer als nur 8 Bit.

Der Befehlssatz war ein typischer CISC-Befehlssatz. Er beinhaltete auch Instruktionen, um Strings zu bearbeiten, Schleifen zu wiederholen bei denen ein Register dekrementiert wurde etc.. Allerdings waren dadurch nicht alle Register gleichberechtigt. So war das BX-Register explizit bei indizierten Zugriffen auf den Speicher als Basisregister (B=Basis) vorgesehen. Dekrement und Inkrement Operationen, verbunden mit Sprüngen, nutzen immer das CX Register (C=Counter) und Ein/Ausgabeoperationen zu Peripheriebausteinen erwarteten die Adresse des Bausteins im DX Register. (D= Data). Nur der Akkumulator AX war universell ausgelegt. Damals von Bedeutung war auch die Unterstützung der BCD-Arithmetik. Diese in der Programmiersprache COBOL genutzte Rechenart und daher bei Großrechnern von IBM sehr wichtig rechnet intern nicht binär sondern nutzte 4 Bit für die Darstellung einer Ziffer von 0 bis 9. Der Vorteil ist das es bei dieser Rechenweise keinerlei Ungenauigkeiten gibt, die es bei Fließkommazahlen im Binärformat gibt. (Eine endliche dezimale Bruchzahl kann eine unendliche binäre Bruchzahl geben). Intel dachte damit vielleicht einen guten Stand beim Eindringen in den Markt zu haben der von größeren Systemen bisher dominiert wurde. Es gab auch anfangs einige Compiler die BCD-Arithmetik unterstützten, z.B. bei den ersten drei Versionen von Turbo Pascal. Es erweis sich, weil es deutlich langsamer war (intern rechnete der Prozessor nach wie vor binär, daher musste man vor und nach Rechnungen die Zahlen jeweils durch Befehle konvertieren) und in den Programmiersprachen die man im Einsatz nutzte wie C, Basic oder Pascal kein Bestandteil der Sprache war dann jedoch als überflüssiges Feature.

Den Geschwindigkeitsvorteil vom Faktor 2,5 gegenüber einem gleich hoch getakteten 8080 bezog der 8086 vor allem dadurch, dass er anders als diese Prozessoren in der Hardware multiplizieren und dividieren konnte. Daneben war die Taktfrequenz von anfangs 5-8 MHz (8080: 2-2,5 MHz) deutlich höher. Intel gibt für die 8 MHz Version die sechs bis zehnfache 8080 Performance gegenüber einem 2 MHz 8080 an, für den weitausmehr verbreiteten 8080 ist es die fünf bis achtfache Performance.

Wie sein Vorgänger 8080 war der 8086 eigentlich kein kompletter Prozessor. Es fehlten für ein Minimalsystem mindestens zwei Bausteine: Einen Taktgenerator (Intel 8284) und zwei bis drei Umschaltbausteine (Latches) um die Speicherbausteine anzusprechen. Denn um Pins zu sparen, verwendeten Steuerbus und Adressbus dieselben Pins. Über eine Steuerleitung musste dann jeweils zwischen den Anschlüssen zur Peripherie und den Speichermodulen umgeschaltet werden, damit man nicht versehentlich in den Speicher schrieb. So hatte der 8086 trotz mehr Fähigkeiten das gleiche 40-polige Gehäuse wie sein Vorfahr, der 8080.

8085 aufbau 2Eine Verbesserung gegenüber dem Vorgänger 8080 war in der Architektur vor allem das Trennen der Bus und Ausführungseinheit, wodurch diese überlappend arbeiten konnten. Eine Befehlsqueue erlaubte es der Buseinheit unabhängig von der Ausführung schon Daten zu holen, also den Fetch oder die Operanden während noch die Dekodierung und Ausführung lief. Intels Designer untersuchten dies an einer typischen Befehlssequenz von drei Befehlen, davon einer mit einem Operanden aus dem Speicher und konnten deren Dauer von 34 auf 23 Takte drücken, also die Geschwindigkeit um 47% steigern. Praktisch erreichte ein 8086 so 800.000 Instruktionen pro Sekunde. Im Mittel 7,5 Takte wurden für eine Anweisung benötigt. Gegenüber der 8 Bit Generation benötigten die Fetchs weniger Zeit, sodass eine 5 MHz 8085 mit 250 ns RAMs auskam (sofern nicht ein zweiter Chip auf die RAM zugriff), das war ein höherer Takt als bei der Z80, die maximal auf 4 MHz bei 250 ns RAMs getaktet werden konnte.

Obwohl er damit einer der langsameren 16 Bit Prozessoren war, wurde zeitlich mit der Einführung des 8086 im Juni 1979 mit dem 8088 eine zweite Version vorgestellt. Der 8088 unterschied sich nicht in der internen Architektur, hatte aber nur einen 8 Bit breiten Datenbus. Das hatte einen praktischen Vorteil: Der 8088 konnte für die Ansteuerung von Peripherie auf die für den 8080 produzierten 8-Bit-Bausteine zurückgreifen. Diese wurden seit Jahren produziert und waren daher preiswerter als die Neuen für den 8086 mit 16 Bit Datenbus benötigten. Dafür musste man 16 Bit Daten jeweils in zwei Zyklen transferieren anstatt in einem. Man denkt nun, das wäre keine großer Nachteil. Doch betroffen ist auch der normale Fetch von Instruktionen und durch die Trennung von BIU und EU griff die BIU außer bei lange dauernden Befehlen fast ständig auf den Speicher zu um die Befehlsqeue zu füllen. Bei der höheren Taktfrequenz von 5 bis 8 MHz waren damals verfügbaren bezahlbaren Speicherbausteine so vollständig ausgelastet. Dadurch dass die 8088 für jeden Datenzugriff, aber auch das Holen von Befehlen doppelt so lange brauchte, war der Prefetch fast nicht mehr möglich und auch normale Befehle brauchten länger, wenn sie Daten holten oder schrieben. Bei dem 8088 musste die EU daher sehr oft auf Daten und Instruktionen warten .So hatte ein 8088 in der Praxis nur 60% der Geschwindigkeit eines 8086 bei gleicher Taktfrequenz. Trotzdem wählte ihn IBM als Prozessor für ihren IBM PC, wahrscheinlich aufgrund der Kostenersparnis bei Nutzung der 8 Bit Bausteine für das Motherboard. Diese normative Kraft war sehr klar bei den Nachbauten zu sehen: es gab viel mehr Nachbauten mit dem 8088 Prozessor als mit dem 8086 Prozessor, obwohl dieser die Möglichkeit ermöglichte sich durch höhere Geschwindigkeit vom Original abzusetzen.

1982 erschien der 80186, als Nachfolger des 8086. Er integrierte den Taktgenerator, aber auch andere Bausteine, die man häufig brauchte, wie Interruptcontroller, DMA-Steuerung, Zeitgeber und Refresherzeugung für DRAM. Der 80186 wurde relativ wenig eingesetzt. Zum einen, weil nicht alle diese Bausteine in einem PC benötigt wurden, dagegen eher bei einem Mikrocontroller nützlich waren. Zum Zweiten, weil wenige Monate später das noch leistungsfähigere Nachfolgemodell 80286 erschien, das Basis für die nächste Generation von PCs wurde. Der 80186 wurde aber noch lange als Embedded Prozessor von Intel produziert, erheblich länger als der 8086.

Schon 1980 wurde der Intel 8086 vom Motorola 68000 in der Leistung aber auch in Unkompliziertheit in der Programmierung und Anwendung überholt. Weitere noch leistungsfähigere Prozessoren, wie der Zilog Z8000 und National Semiconductor NS 16032 erschienen. Der 8086 wäre wahrscheinlich schnell vom Markt verschwunden, wenn nicht IBM ihren PC auf ihm aufgebaut hätten und sich dieser durch das Renommee der Firma zu einem Verkaufsschlager entwickelt hätte. Später stellte diese Basis an existierenden Systemen das größte Hindernis beim Wechsel der Hardwareplattform dar. IBM versuchte wenigstens die Software in Form eines neuen Betriebssystems (OS/2) zu wechseln, blieb bei den Prozessoren aber an Intel gebunden.

Technische Daten
Erschienen: Juni 1978
Transistoren: 29.000
Technologie 3 µm NMOS
Taktfrequenzen: 5, 8, 10 MHz
Recheneinheiten Ganz/Fließkomma 1 / 0
Geschwindigkeit Ganzzahlen 0,500 Dhrystones bei 5 MHz
Geschwindigkeit Fließkommazahlen 0,0104 Whetstones bei 5 MHz
Geschwindigkeit: 0,33 - 0,75 MIPS
Spannung: 5 V
Gehäuse: DIL mit 40 Pins
Adressierbarer Speicher: 1 MByte
Datenbus: 16 Bit (8086)
8 Bit (8088)
Nachfolger: 80286
Vorgänger: 8080

Artikel erstellt am 2.7.2014, zuletzt aktualisiert am 17.6.2015

Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensläufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.

Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.

Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.

Mehr über das Buch auf dieser eigenen Seite.

Hier geht's zur Gesamtübersicht meiner Bücher mit direkten Links zum BOD-Buchshop. Die Bücher sind aber auch direkt im Buchhandel bestellbar (da ich über sehr spezielle Themen schreibe, wird man sie wohl kaum in der Auslage finden) und sie sind natürlich in den gängigen Online-Plattformen wie Amazon, Libri, Buecher.de erhältlich.


© des Textes: Bernd Leitenberger. Jede Veröffentlichung dieses Textes im Ganzen oder in Auszügen darf nur mit Zustimmung des Urhebers erfolgen.
Sitemap Kontakt Impressum / Datenschutz Neues Hier werben / advertisment here Buchshop Bücher vom Autor Top 99