{{TODO| * Ein Diagramm zur Registerarchitektur hinzufügen
* Ergänzungen zur Handhabung von Interrupts
* Eingehen auf verschiedene Befehlssätze}} Die '''x86'''-Architektur wurde von Intel entwickelt und nach den Prozessoren der Baureihe 8086 benannt. Alle neueren Prozessoren sind abwärtskompatibel zum 386 bzw 486. Intel selbst nennt diese Architektur heute IA-32. In absehbarer Zukunft wird der x86-Standard aber wohl durch den [[x64]]-Standard abgelöst werden. ==CPU== ===Register=== ====Übersicht====
{| {{Prettytable}} ! Bits || Register |- | '''8''' || AL, BL, CL, DL, AH, BH, CH, DH |- | '''16''' || AX, BX, CX, DX, DI, SI, BP, SP, CS, DS, ES, FS, GS, SS |- | '''32''' || EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, EIP, EFLAGS |- | '''128''' || XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7 |}
====Allzweckregister==== {| | {| {{Prettytable}} ! colspan="4" align="center" | Bytes |- ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="4" align="center" | E?X |- | colspan="2" style="background:lightgrey" | | colspan="2" align="center" | ?X |- | colspan="2" style="background:lightgrey" | | align="center" | ?H | align="center" | ?L |- | colspan="4" style="background:lightgrey" align="center" | ? = A, B, C, D |} | Die Allzweckregister können, wie ihr Name schon andeutet, eigentlich für jeden Zweck genutzt werden. Trotzdem gibt es einige gebräuchliche Nutzungen: * '''EAX''' (engl.: '''A'''ccumulator Register): für Rechenoperatioen, als Rückgabewert in [[C]] * '''EBX''' (engl.: '''B'''ase Register): als Basisadresse für indizierte Adressierung * '''ECX''' (engl.: '''C'''ounter Register): als Zähler * '''EDX''' (engl.: '''D'''ata Register) |} ====Indexregister==== {| | {| {{Prettytable}} ! colspan="4" align="center" | Bytes |- ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="4" align="center" | E?I |- | colspan="2" style="background:lightgrey" | | colspan="2" align="center" | ?I |- | colspan="4" style="background:lightgrey" align="center" | ? = D, S |} | Die Indexregister werden oft als Indizes in Datenbereichen (v. a. bei den eingebauten Stringoperationen) verwendet. Dabei zeigt * '''ESI''' (engl.: '''S'''ource '''I'''ndex) auf die Quelle * '''EDI''' (engl.: '''D'''estination '''I'''ndex) auf das Ziel |} ====Zeigerregister==== {| | {| {{Prettytable}} ! colspan="4" align="center" | Bytes |- ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="4" align="center" | E?P |- | colspan="2" style="background:lightgrey" | | colspan="2" align="center" | ?P |- | colspan="4" style="background:lightgrey" align="center" | ? = B, S |} | Die Zeigerregister werden genutzt, um auf Stellen im Speicher zu zeigen. * '''ESP''' (engl.: Stack Pointer): Zeigt ''immer'' auf den aktuellen Stack * '''EBP''' (engl.: Base Pointer): Wird meistens für Stackframes und lokale Variablen bei Funktionsaufrufen verwendet |} ====Instruktionsregister==== {| | {| {{Prettytable}} ! colspan="4" align="center" | Bytes |- ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="4" align="center" | EIP |- | colspan="2" style="background:lightgrey" | | colspan="2" align="center" | IP |} | Das Instruktionsregister '''EIP''' (engl.: '''I'''nstruction '''P'''ointer) zeigt ''immer'' auf den nächsten auszuführenden Befehl. Es kann nicht direkt geändert oder ausgelesen werden, sondern nur über Instruktionen wie ''jmp'', ''call'' oder ''ret''. |} ====Flagregister==== → ''Hauptartikel: [[EFLAGS]]'' {| | {| {{Prettytable}} ! colspan="4" align="center" | Bytes |- ! width="30pt" | 3 ! width="30pt" | 2 ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="4" align="center" | EFLAGS |} | Das Flagregister '''EFLAGS''' speichert einige Konfigurationsmöglichkeiten und Systemzustände, beispielsweise, ob Interrupts gerade erlaubt sind oder ob ein Übertrag bei einer Addition stattfand. |} ====Segmentregister==== {| | {| {{Prettytable}} ! colspan="2" align="center" | Bytes |- ! width="30pt" | 1 ! width="30pt" | 0 |- | colspan="2" align="center" | ?S |- | colspan="2" style="background:lightgrey" align="center" | ? = C, D, E, F, G, S |} | Die Segmentregister geben die Basisadresse des aktuellen Segments an. Dabei steht * '''CS''' für das '''C'''ode-'''S'''egment * '''DS''' für das '''D'''aten-'''S'''egment * '''SS''' für das '''S'''tack-'''S'''egment * '''ES''' für das '''E'''xtra-'''S'''egment '''FS''' und '''GS''' sind zusätzliche Daten-Segmente (wie '''ES'''). |} Die Segmentregister sind im [[Protected Mode]] auch für die Segmentierung mit Hilfe der [[GDT]] verantwortlich. ==== Zusätzliche Spezialregister ==== * GDTR (engl.: Global Descriptor Table Register) enthält Position und Größe der [[GDT]] * LDTR (engl.: Local Descriptor Table Register) enthält den Selektor der [[LDT]] * IDTR (engl.: Interrupt Descriptor Table Register) enthält Position und Größe der [[IDT]] * CR0, CR2, CR3 und CR4 (engl.: [[Control Register]]) werden im [[Protected Mode]] für erweiterte Einstellungen des Prozessorzustandes genutzt, z. B. für [[Paging]] (hier insbesondere CR2 und CR3) * TR6 – TR7 (engl.: Test Register) zum Überprüfen des [[Paging#Translation_Lookaside_Buffer|Translation Lookaside Buffers]] (TR0 – TR5 gibt es beim 80386 nicht) * DR0 – DR7 (engl.: [[Debug Register|Debug Register]]) zum Setzen von [[Breakpoint]]s * TR (engl.: Task Register) Segment-Selektor des [[TSS]] * [[MSR]]s (engl.: '''M'''achine-'''S'''pecific '''R'''egister) === Erkennen der CPU === Mit dem Befehl [[CPUID]] kann man beispielsweise die von der CPU unterstützten Features oder Daten wie den Hersteller der CPU auslesen. == sonstige Hardware == {{TODO|Andere zur Platform gehörende Hardware auflisten mit Links zu den entsprechenden Artikeln}} == Weblinks == * [http://de.wikipedia.org/wiki/X86 Wikipedia x86] * [http://www.intel.com/products/processor/manuals/ Intel Manuals] * [http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals AMD Manuals] [[Kategorie:Hardware]] [[Kategorie:x86|!x86]]