{{Achtung|Text= Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! (Der Artikel könnte zwischenzeitlich ein wenig komisch anmuten ;-) ~[[Benutzer:SHyx0rmZ|SHyx0rmZ]] 10:55, 6. Aug. 2009 (CEST)}}
{{Hinweiss|Text=In den nachfolgenden Tabellen werden gelegentlich Tabellenzellen mit blauem oder grünen Hintergrund auftauchen.
Diese deuten einen '''herstellerspezifischen''' Eintrag an. Auf anderen Prozessoren sind diese Einträge '''reserviert'''!}}
So sehen die herstellerspezifischen Tabellenzellen aus:
{| {{prettytable}}
! Farbe
! Bedeutung
|-
{{csintel|1}} Blau
{{csintel|1}} Dieser Eintrag gilt '''ausschließlich''' für '''Intel'''-Prozessoren. Auf AMD-Prozessoren ist dieser Eintrag '''reserviert'''!.
|-
{{csamd|1}} Grün
{{csamd|1}} Dieser Eintrag gilt '''ausschließlich''' für '''AMD'''-Prozessoren. Auf Intel-Prozessoren ist dieser Eintrag '''reserviert'''!.
|}
{{Hinweiss|Text=Manchmal folgen in der Beschreibung eines Registers auch '''zwei Tabellen'''. Die erste Tabelle ist dann zur schnellen Übersicht gedacht, die zweite Tabelle beschreibt die Funktion der Einträge.}}
Der '''CPUID'''-Befehl liefert, sofern er denn von der CPU unterstützt wird, Informationen zu zahlreichen Fähigkeiten der CPU, wie zum Beispiel den Herstellernamen, die Modellnummer oder die Größe des Caches.
== Wie man CPUID benutzt ==
Bevor man munter versucht, mit dem CPUID Befehl Informationen auszulesen, sollte man ersteinmal prüfen, ob die CPU den Befehl überhaupt unterstützt. Dazu testet man, ob das ID-Flag gesetzt und gelöscht werden kann.
Aussehen kann das zum Beispiel so:
pushfd ; Sichere Flags
pushfd ; Sichere Flags
pop ecx ; Lade Flags in EXC
mov eax, ecx ; Schiebe Flags in EAX
xor eax, 0x200000 ; Vertausche das ID-Flag
push eax ; Sichere neue Flags
popfd ; Lade neue Flags in EFLAGS
; Wenn CPUID unterstützt wird, wird das geänderte ID-Flag übernommen
; Ansonsten wird bleibt das alte ID-Flag bestehen
pushfd ; Sichere Flags
pop eax ; Lade Flags in EAX
xor eax, ecx ; Vergleiche EAX und ECX
popfd ; Stelle Original Flags wieder her
je cpuid_unsupported ; EAX und ECX sind gleich, CPUID wird nicht unterstütz!
jmp cpu_supported ; EAX und ECX sind verschieden, CPUID wird unterstützt!
Um den CPUID-Befehl auszuführen, verwendet man einfach den Assembler-Befehl '''CPUID'''. Die Funktionsnummer der CPUID-Funktion wird dabei im '''EAX'''-Register übergeben. Die Rückgabewerte werden in den Registern '''EAX''', '''EBX''', '''EDX''' und '''ECX''' abgelegt.
Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, auszulesen, ruft man CPUID mit der Funktionsnummer 0x00000000 auf.
mov eax, 0x00000000 ; xor eax, eax bewirkt das selbe und ist schneller
cpuid ; Der Vendor-ID-String befindet sich nun in (in dieser Reihenfolge), EBX, EDX, ECX
Ein '''AMD'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"
Ein '''Intel'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''"
= Standard Funktionen =
Die Standard Funktionsnummern beginnen bei 0. Der größtmögliche Funktionsnummer, die von der jeweiligen CPU unterstützt wird befindet sich nach dem Aufruf von Funktion 0 im ''EAX''-Register.
Die Standard Funktionen sind nicht Hersteller spezifisch, sondern sollen für alle CPUs gleich sein.
== Funktion 0x0000_0000 ==
CPUID-Funktion Nr. 0x00 gibt höchste vom Prozessor unterstützte Funktionsnummer im '''EAX'''-Register und die [[CPUID#Vendor-ID-Strings|Vendor-ID]] in den Registern '''EBX''', '''EDX''' und '''ECX'''(in dieser Reihenfolge) an.
{{Achtung|Text= Der String ist nicht nullterminiert!}}
====EAX====
{| {{prettytable32bit|size="30pt"}}
{{cs|32}}Höchste, unterstützte Standard-Funktion
|}
====EBX====
{| {{prettytable32bit|size="30pt"}}
{{cs|32}} Bytes 0 - 3 des Vendor-ID-Strings
|}
====ECX====
{| {{prettytable32bit|size="30pt"}}
{{cs|32}} Bytes 8 - 11 des Vendor-ID-Strings
|}
====EDX====
{| {{prettytable32bit|size="30pt"}}
{{cs|32}} Bytes 4 - 7 des Vendor ID-Strings
|}
==== Vendor-ID-Strings ====
{| {{prettytable}}
! Vendor-ID-String
! Hersteller
|-
| "AuthenticAMD"
| AMD
|-
| "CentaurHauls"
| Centaur
|-
| "CyrixInstead"
| Cyrix
|-
| "GenuineIntel"
| Intel
|-
| "NexGenDriven"
| NexGen
|-
| "Geode by NSC"
| National Semiconductor
|-
| "RiseRiseRise"
| Rise
|-
| "SiS SiS SiS "
| SiS
|-
| "GenuineTMx86"
| Transmeta
|-
| "UMC UMC UMC "
| UMC
|-
| "VIA VIA VIA "
| VIA
|}
== Funktion 0x0000_0001 ==
==== EAX ====
{| {{prettytable32bit|size="30pt"}}
{{csr|4}}
{{cs|8}} Erweiterte Familie
{{cs|4}} Erweitertes Modell
{{csr|2}}
{{csintel|2}} Typ
{{cs|4}} Familie
{{cs|4}} Modell
{{cs|4}} Stepping
|}
==== EBX ====
{| {{prettytable32bit|size="30pt"}}
{{cs|8}} [[APIC|APIC ID]]
{{cs|8}} Anzahl logischer Prozessoren
{{cs|8}} CLFLUSH Size
{{cs|8}} Brand ID
|}
{{Achtung|Text='''APIC ID''' ist nur gültig wenn das '''[[#EDX_-_Featureflags|APIC-Flag]]''' gesetzt ist.
Die Anzahl der logischen Prozessoren ist nur bei gesetztem '''[[#EDX_-_Featureflags|Hyper-Threading-Flag]]''' gültig.
'''CLFLUSH Size''' gibt die Größe einer Cache line in 8 Byte Blöcken an. Das Feld ist nur gültig in Verbindung mit einem gesetzten '''[[#EDX_-_Featureflags|CFLUSH-Flag]]'''.
}}
==== ECX - Featureflags ====
{| {{prettytable32bit|size="30pt"}}
{{csamd|1}} RAZ
{{csr|3}}
{{csintel|1}} OSXSAVE
{{csintel|1}} XSAVE
{{csr|2}}
{{cs|1}} POPCNT
{{csintel|1}} MOVBE
{{csintel|1}} x2APIC
{{csintel|1}} SSE4.2
{{cs|1}} SSE4.1
{{csintel|1}} DCA
{{csr|2}}
{{csintel|1}} PDCM
{{csintel|1}} xTPR
{{cs|1}} CX16
{{csr|2}}
{{csintel}} CNXT-ID
{{cs|1}} SSSE3
{{csintel|1}} TM2
{{csintel|1}} EST
{{csintel|1}} SMX
{{csintel|1}} DS-CPL
{{cs|1}} MONITOR
{{csintel|1}} DTES64
{{csr|1}}
{{cs|1}} SSE3
|}
Dieses Register gibt erweiterte Informationen über den Prozessor:
{| {{Prettytable}}
! Bits || Funktion
|-
| 9 || Verfügbarkeit von SSSE3
|-
| 5 || Verfügbarkeit von Virtual Machine Extensions (VMX)
|-
| 3 || Die Befehle MONITOR und MWAIT sind verfügbar
|-
| 0 || Verfügbarkeit von SSE3
|}
==== EDX - Featureflags====
Dies sind die Featureflags. Wenn ein Bit gesetzt(=1) ist, dann wird das entsprechende Feature unterstützt.
{| {{prettytable32bit|size="30pt"}}
{{csintel|1}} PBE
{{csintel|1}} IA64
{{csintel|1}} TM
{{cs|1}} HTT
{{csintel|1}} SS
{{cs|1}} SSE2
{{cs|1}} SSE
{{cs|1}} FXSR
{{cs|1}} MMX
{{csintel|1}} ACPI
{{csintel|1}} DS
{{csr|1}}
{{cs|1}} CLFLSH
{{csintel|1}} PSN
{{cs|1}} PSE-36
{{cs|1}} PAT
{{cs|1}} CMOV
{{cs|1}} MCA
{{cs|1}} PGE
{{cs|1}} MTRR
{{cs|1}} SEP
{{csr|1}}
{{cs|1}} APIC
{{cs|1}} CX8
{{cs|1}} MCE
{{cs|1}} PAE
{{cs|1}} MSR
{{cs|1}} TSC
{{cs|1}} PSE
{{cs|1}} DE
{{cs|1}} VME
{{cs|1}} FPU
|}
{| {{prettytable}}
! width="30pt" | Bit
! Funktion
|-
{{csh|1}} 31
{{csintell|1}} Unterstützt die Benutzung des FERR#-Pins und des PBE#-Pins um dem Prozessor im Stop Clock State (STPCLK#) zu signalisieren, dass er einen wartenden Interrupt bearbeiten und dann zur normalen Ausführung zurückkehren soll.
|-
{{csh|1}} 30
{{csintell|1}} Gehört zur Intel Intanium Familie und läuft gerade im IA32-Emulationsmodus
|-
{{csh|1}} 29
{{csintell|1}} Implementiert den "Thermal Monitor aumatic thermal control circuitry" (TCC)
|-
{{csh|1}} 28
{{csl|1}} Kann mehr als einen logischen Prozessor verwalten
|-
{{csh|1}} 27
{{csl|1}} Unterstützt die Verwaltung von miteinander in Konflikt stehenden Speichertypen
|-
{{csh|1}} 26
{{csl|1}} Unterstützt [[SSE2]]
|-
{{csh|1}} 25
{{csl|1}} Unterstütz [[SSE]]
|-
{{csh|1}} 24
{{csl|1}} Unterstützt die '''FXSAVE''' und '''FXSTOR''' Befehle, mit denen die [[Register#Floatingpointregister|Floatingpointregister]] schnell gesichert werden können
|-
{{csh|1}} 23
{{csl|1}} Unterstützt [[MMX]]
|-
{{csh|1}} 22
{{csintell|1}} Unterstützt Überwachung der Prozessortemperatur und Änderung des Prozessortaktes
|-
{{csh|1}} 21
{{csintell|1}} Kann Debug Informationen in im Hauptspeicher präsente Buffer schreiben
|-
{{csh|1}} 20
{{csr|1}}
|-
{{csh|1}} 19
{{csl|1}} Unterstützt den '''CLFLUSH''' Befehl
|-
{{csh|1}} 18
{{csintell|1}} Besitzt eine 96-Bit Prozessor-Seriennummer (Nur verfügbar auf Prozessoren, die neuer als Pentium 4 sind)
|-
{{csh|1}} 17
{{csl|1}} Unterstützt [[Page Size Extension|36-Bit Page Size Extensions]] (4-MiB [[Paging|Pages]])
|-
{{csh|1}} 16
{{csl|1}} Unterstützt das [[Paging|PAT-Bit]]
|-
{{csh|1}} 15
{{csl|1}} Unterstützt den '''CMOVcc''' Befehl, mit dem Bedingte Verschiebungen vorgenommen werden können
|-
{{csh|1}} 14
{{csl|1}} Unterstützt die Machine-Check Architektur (Besonders das '''MTRR_CAP'''-Register)
|-
{{csh|1}} 13
{{csl|1}} Unterstützt das [[Paging|Page-Global-Bit]]
|-
{{csh|1}} 12
{{csl|1}} Unterstützt MTRR-Register (Besonders das '''MTRR_CAP'''-Register)
|-
{{csh|1}} 11
{{csl|1}} Unterstützt schnelle [[Systemcall|Systemcalls]] durch die Befehle '''SYSENTER''' und '''SYSEXIT'''
|-
{{csh|1}} 10
{{csr|1}}
|-
{{csh|1}} 9
{{csl|1}} Besitzt einen lokalen [[APIC]]
|-
{{csh|1}} 8
{{csl|1}} Unterstützt den '''CMPXCHG8B''' Befehl
|-
{{csh|1}} 7
{{csl|1}} Unterstützt Machine-Check-[[Exception|Exceptions]]
|-
{{csh|1}} 6
{{csl|1}} Unterstützt physische Adressen, die größer als 32-Bit sind
|-
{{csh|1}} 5
{{csl|1}} Implementiert Modellspezifische Register über die Befehle '''RDMSR''' und '''WRMSR'''
|-
{{csh|1}} 4
{{csl|1}} Unterstützt den '''RDTSC''' Befehl und CR4.TSD-Bit
|-
{{csh|1}} 3
{{csl|1}} Unterstützt 4-MiB [[Paging|Pages]]
|-
{{csh|1}} 2
{{csl|1}} Unterstützt I/O-Breakpoints, das CR4.DE-Bit und die DR4- und DR5-Register
|-
{{csh|1}} 1
{{csl|1}} Unterstützt den [[Virtual 8086 Mode]]
|-
{{csh|1}} 0
{{csl|1}} Besitzt eine [[FPU]], die den x87-Befehlssatz implementiert
|}
== EAX = 0x00000002 ==
Wenn in EAX statt Null Zwei steht, dann werden bei Intelprozessoren
Informationen über den Cache und die TLB-Deskriptoren ausgegeben.
== EAX = 0x00000003 ==
Wenn in EAX statt Null Drei steht, wird bei Intelprozessoren
stattdessen folgendes ausgegeben:
==== EAX ====
Reserviert
==== EBX ====
Reserviert
==== ECX ====
Die Bits 31 bis 0 der Prozessor-ID sind darin hinterlegt.
'''Funktioniert nur bei Prozessoren, bei denen das entsprechende ''[[#EDX_-_Featureflags|Featureflag(Bit 18)]]'' gesetzt ist.'''
==== EDX ====
Die Bits 63 bis 32 der Prozessor-ID sind darin hinterlegt.
''(siehe oben)''
= Erweiterte Funktionen =
Es gibt Funktionen, die Hersteller spezifisch sind, d.h. sieh gelten nur nur für Intel- bzw. nur für AMD Prozessoren. Solche Befehle sollte man nicht ausführen, wenn man nicht weiß von welchem Hersteller die CPU ist! Zum Beispiel sollten CPUID-Befehle, die nur für Intel-CPUs gelten, nicht auf einer AMD-CPU ausgeführt werden. Diese Funktionen beginnen bei 0x80000000.
Erweiterte Funktionen von Intel:
== EAX = 0x80000000 ==
==== EAX ====
Enthält maximale erweiterte Funktionsnummer.
==== EBX ====
Reserviert
==== ECX ====
Reserviert
==== EDX ====
Reserviert
== EAX = 0x80000001 ==
==== EAX ====
Reserviert
==== EBX ====
Reserviert
==== ECX ====
Reserviert
==== EDX ====
Wenn Bit 29 gesetzt, dann ist Intel64-Technologie verfügbar
== EAX = 0x80000002 ==
==== EAX ====
Eingebrannter String
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
== EAX = 0x80000003 ==
==== EAX ====
Eingebrannter String (Fortsetzung)
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
== EAX = 0x80000004 ==
==== EAX ====
Eingebrannter String (Fortsetzung)
==== EBX ====
Eingebrannter String (Fortsetzung)
==== ECX ====
Eingebrannter String (Fortsetzung)
==== EDX ====
Eingebrannter String (Fortsetzung)
== Siehe auch ==
* [http://wiki.osdev.org/CPUID Englischer Artikel über den CPUID-Befehl]
* [http://sandpile.org/ia32/cpuid.htm Englische Doku von CPUID; mit AMD/INTEL und anderen Prozessoren]
* [http://support.intel.com/Assets/PDF/appnote/241618.pdf Intels CPUID-Spezifikation]
* [http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf AMDs CPUID-Spezifikation]
[[Category:Glossar]]
[[Category:x86]]
[[Category:x86-Befehle]]