X86 — Änderungen 6738 → 6745

Zeile 3: Zeile 3:
 
* Ergänzungen zur Handhabung von Interrupts<br>
 
* Ergänzungen zur Handhabung von Interrupts<br>
 
* Eingehen auf verschiedene Befehlssätze}}
 
* Eingehen auf verschiedene Befehlssätze}}
−
Die x86-Architektur galt lange Zeit als quasi Standard für so gut wie alle Prozessoren. Sie wurde von Intel ins Leben gerufen und nach den Prozessoren der Baureihe 8086/8088 benannt. Der wirkliche Durchbruch begann allerdings erst mit dem ersten 32 Bit Prozessor, dem 80386, oder auch kurz 386 genannt. Der grundlegende Prozessoraufbau ist seitdem gleichgeblieben, alle neueren Prozessoren sind seitdem abwärtskompatibel zum 386 bzw 486. Intel selbst nennt diese Architektur heute IA-32 (<b>I</b>ntel <b>A</b>rchitecture with <b>32</b> Bit).
+
Die '''x86'''-Architektur galt lange Zeit als quasi Standard für so gut wie alle Prozessoren. Sie wurde von Intel ins Leben gerufen und nach den Prozessoren der Baureihe 8086/8088 benannt. Der wirkliche Durchbruch begann allerdings erst mit dem ersten 32 Bit Prozessor, dem 80386, oder auch kurz 386 genannt. Der grundlegende Prozessoraufbau ist seitdem gleichgeblieben, alle neueren Prozessoren sind seitdem abwärtskompatibel zum 386 bzw 486. Intel selbst nennt diese Architektur heute IA-32 (<b>I</b>ntel <b>A</b>rchitecture with <b>32</b> Bit).
 
In absehbarer Zukunft wird der x86 Standard aber wohl durch den [[x64]]-Standard ersetzt werden.
 
In absehbarer Zukunft wird der x86 Standard aber wohl durch den [[x64]]-Standard ersetzt werden.
  
  
−
== Aufbau einer 32-Bit-CPU ==
+
==CPU==
−
Details siehe [[Register]].
+
===Register===
−
=== Mehrzweckregister ===
+
====Übersicht====
−
Die 32 Bit x86 Prozessoren verfügen über 4 je 32 Bit breite Mehrzweck-Register, wobei das 'E' jeweils für ''Extended'' steht:
+
<center>
−
* EAX (engl.: <b>A</b>ccumulator Register) wird in [[C]] für Rückgabewerte von Funktionen verwendet
+
{| {{Prettytable}}
−
* EBX (engl.: <b>B</b>ase Register)
+
! Bits  || Register
−
* ECX (engl.: <b>C</b>ounter Register) meistens als Zähler verwendet
+
|-
−
* EDX (engl.: <b>D</b>ata 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
 +
|}
 +
</center>
  
−
Diese Mehrzweck-Register (engl.: General Purpose Registers) sind vielseitig verwendbar.
 
−
 
−
Des Weiteren gibt es:
 
−
* ESI (engl.: <b>S</b>ource <b>I</b>ndex) zeigt bei Stringoperationen auf die Quelle
 
−
* EDI (engl.: <b>D</b>estination <b>I</b>ndex) zeigt bei Stringoperationen auf das Ziel
 
−
* EBP (engl.: <b>B</b>ase <b>P</b>ointer) Pointer auf den Start des Speichers für ein (Unter-) Programm
 
−
* ESP (engl.: <b>S</b>tack <b>P</b>ointer) zeigt auf das aktuelle Element des Stacks, sollte nicht verändert werden wenn man nicht weiß was man tut
 
  
−
=== Segmentregister ===
+
====Allzweckregister====
−
* DS (engl.: <b>D</b>ata <b>S</b>egment)
+
{|
−
* CS (engl.: <b>C</b>ode <b>S</b>egment)
+
|
−
* SS (engl.: <b>S</b>tack <b>S</b>egment)
+
{| {{Prettytable}}
−
* FS
+
! colspan="4" align="center" | Bytes
−
* GS
+
|-
−
* ES
+
! 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
 +
|}
  
−
=== Zusätzliche Spezialregister ===
+
| Die Allzweckregister können, wie ihr Name schon andeutet eigentlich für fast jeden Zweck genutzt werden. Trotzdem gibt es einige gebräuchliche Nutzungen:
−
* EIP (engl.: <b>I</b>nstruction <b>P</b>ointer) zeigt auf den nächsten auszuführenden Befehl
+
* '''EAX''' (engl.: '''A'''ccumulator Register): für Rechenoperatioen, als Rückgabewert in [[C]]
−
* [[EFLAGS]] (engl.: Flag Register) die einzelnen Bits haben unterschiedliche Bedeutung und werden für bedingte Sprungbefehle eingesetzt
+
* '''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 Indexe in Datenbereichen (va. 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.: <b>S</b>tack <b>P</b>ointer): Zeigt ''immer'' auf den aktuellen Stack
 +
* '''EBP''' (engl.: <b>B</b>ase <b>P</b>ointer): 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 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änden, 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'''ata-'''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.
 +
 
 +
|}
 +
Die Segmentregister sind im [[Protected Mode]] auch für die Segmentierung mit Hilfe der [[GDT]] verantwortlich.
 +
 
 +
 
 +
==== Zusätzliche Spezialregister ====
 
* GDTR (engl.: <b>G</b>lobal <b>D</b>escriptor <b>T</b>able <b>R</b>egister) gibt die Position der [[GDT]] an
 
* GDTR (engl.: <b>G</b>lobal <b>D</b>escriptor <b>T</b>able <b>R</b>egister) gibt die Position der [[GDT]] an
 
* LDTR (engl.: <b>L</b>ocal <b>D</b>escriptor <b>T</b>able <b>R</b>egister) gibt die Position der [[LDT]] an
 
* LDTR (engl.: <b>L</b>ocal <b>D</b>escriptor <b>T</b>able <b>R</b>egister) gibt die Position der [[LDT]] an
Zeile 44: Zeile 184:
 
* [[MSR]]s (engl.: '''M'''achine-'''S'''pecific '''R'''egister)
 
* [[MSR]]s (engl.: '''M'''achine-'''S'''pecific '''R'''egister)
  
−
== Erkennen der CPU ==
+
 
−
Mit dem Befehl [[CPUID]] kann man Daten wie Hersteller der CPU auslesen.
+
=== 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 ==
 
== Weblinks ==
 
* [http://de.wikipedia.org/wiki/X86 Wikipedia x86]
 
* [http://de.wikipedia.org/wiki/X86 Wikipedia x86]