Einführung in die 80x86-Architektur
Historische Entwicklung der Architektur (Ätiologie)
Ihren Anfang nahm die 80x86 Architektur im Jahre 1978 mit dem 8086, einem Intel Prozessor der dritten Generation. Der 8086 war ein 29.000 Transistoren umfassender 2-Adress-16-Bit-Prozessor. Der 20 Bit umfassende Adressraum wurde durch ein segmentiertes Speichermodell erreicht.
Im Jahre 1982 brachte Intel dann den 80286 Prozessor heraus, der deutlich leistungsfähiger war und um Merkmale erweitert wurde, wie sie von Multi-Tasking, Multi-User Betriebssystemen gefordert werden. Dazu wurde ein neuer Betriebsmodus, der Protected-Mode, eingeführt.
Im Jahre 1985 gelang Intel mit der Einführung des 80386 der Sprung in die Welt der 32-Bit Prozessoren. Der 80386 unterstützt eine seiten-virtuelle Speicherverwaltung und sein Befehlssatz wurde um 32-Bit Befehle und diverse Befehle zur Bitmanipulation erweitert.
1989 brachte Intel dann den 486-DX Prozessor auf den Markt, der u.a. eine integrierte Fließkommaeinheit und einen integrierten Cache besaß.
Mit dem Pentium schuf Intel 1993 den ersten superskalaren x86 Prozessor mit einem 64-Bit breitem Datenbus. Die späteren MMX-Befehlserweiterungen stellten die ersten umfangreichen Architekturerweiterungen seit dem 386er dar. Die MMX-Befehle sind Single Instruction Multiple Data (SIMD) Befehle auf Integer-Basis, die aus Kompatibilitätsgründen auf den 8 80-Bit-Registern der internen Fließkommaeinheit arbeiten.
Register
Der 8086 besitzt insgesamt 8 allgemeine Register, 4 Segmentregister, ein Flaggenregister und den Befehlszeiger.
Von den 8 allgemeinen Registern sind 4 in jeweils 2 Byteregister aufgeteilt und 4 als Indexregister konzipiert. (Siehe dazu auch die untere Grafik.) Sie erfüllen in Zusammenhang mit bestimmten Befehlen besondere Aufgaben. Das Register AX ist als Akkumulator konzipiert, BX als Basisregister für die indirekte Adressierung, CX wird von einigen Befehlen als Counter-Register verwendet, DX stellt ein allgemeines Datenregister dar, SI (Source-Index) und DI (Destination-Index) werden von den Stringbefehlen zur Adreßberechnung herangezogen, SP bezeichnet den aktuellen Stackpointer und BP einen Pointer für den aktuellen Stackframe.
Von den Segmentregistern haben CS, das Codesegment, DS, das Datensegment, und SS, das Stacksegment, eine zentrale Bedeutung. Die übrigen Segmentregister stehen dem Anwendungsprogramm zur freien Verfügung.
Mit dem 386er sind die allgemeinen Register, der IP sowie die Flags auf 32-Bit erweitert worden und zwei weitere Segmentregister (FS und GS) zur Verfügung gestellt worden. Im 32-Bit Modus kann nun mit allen allgemeinen Registern indirekt adressiert und optional ein Skalierungsfaktor angegeben werden.
Adressierung
Im (klassischen) Real-Mode wird eine physikalische Speicheradresse direkt aus dem Segmentwert, der in einem Segmentregister vorgeben ist, und einem Offsetwert gebildet. Dazu wird der Segmentwert mit 16 multipliziert und der Offsetwert dazuaddiert.
Der Protected-Mode beinhaltet eine andere Form der Speicheradressierung. Hier werden die Werte in den Segmentregistern nicht mehr direkt zur Adressgenerierung herangezogen, sondern stellen Selektoren dar, die einen Index in Deskriptortabellen bezeichnen. Ein solcher Deskriptor enthält dann u.a. die Basisadresse und die Größe eines Segmentes. Die Basisadresse und die Größe einer Deskriptortabelle ist in einem Deskriptor Table Register (xDTR) vorgegeben.
Befehlsformat
Beim 80x86-Befehlsformat sind vor dem eigentlichen Operationscode eine Reihe möglicher Präfixe definiert. Dazu gehören u.a. ein Repeat-Präfix für Stringbefehle, Präfixe zum Überschreiben der 16 bzw. 32 Bit Vorgabe für die Adreß- bzw. Operandengröße und ein Segment-Override, mit dem die implizite Segmentvorgabe der entsprechenden Adressierung durch eine explizite Segmentangabe überschrieben werden kann. Dem ein oder zwei Byte umfassenden Opcode folgen optional eine Adressierungsangabe in Form eines ModR/M- und eines SIB-Bytes (Skalierung, ab 386er), eine relative Adresse und gegebenenfalls ein konstanter Wert. Darüberhinaus sind auch noch opcode-spezifische kleinere Code-Felder definiert.
Der 80386 Registersatz
| 31..16 |
15..8 |
7..0 |
|
| |
AH |
AL |
| |
AX |
| EAX |
|
| |
BH |
BL |
| |
BX |
| EBX |
|
| |
CH |
CL |
| |
CX |
| ECX |
|
| |
DH |
DL |
| |
DX |
| EDX |
|
| |
SI |
| ESI |
|
| |
DI |
| EDI |
|
| |
SP |
| ESP |
|
| |
BP |
| EBP |
| 31..16 |
15..0 |
|
| |
CS |
|
| |
DS |
|
| |
SS |
|
| |
ES |
|
| |
FS |
|
| |
GS |
| 31..16 |
15..0 |
|
| |
Flags |
| EFlags |
|