CPUID — Änderungen 5106 → 5116

Zeile 1: Zeile 1:
−
{{Achtung|Text= Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! ~~ [[Benutzer:SHyx0rmZ|SHyx0rmZ]] 10:55, 6. Aug. 2009 (CEST)}}
+
{{Achtung|Text= Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! ~[[Benutzer:SHyx0rmZ|SHyx0rmZ]] 10:55, 6. Aug. 2009 (CEST)}}
−
Der CPUID-Befehl wird benutzt, um Informationen über die Fähigkeiten eines Prozessors zu erhalten, wie zum Beispiel den Herstellernamen, die Modellnummer, die Größe des Caches, usw.
+
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 ==
 
== Wie man CPUID benutzt ==
−
Um den CPUID-Befehl auszuführen, verwendet man einfach den Assembler-Befehl "CPUID". Die nötigen Parameter(Funktionsnummer) werden dabei im Register EAX angegeben. Die Rückgabewerte werden in den Registern ''EAX'', ''EBX'', ''EDX'' und ''ECX'' abgelegt.
+
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.
  
−
Um zum Beispiel den Vendor-ID-String, also den Herstellernamen, zu bekommen, ruft man CPUID mit der Funktionsnummer 0x00 auf.
+
Aussehen kann das zum Beispiel so:
 
<asm>
 
<asm>
−
mov eax, 0x00; xor eax, eax bewirkt das selbe und ist schneller
+
pushfd                ; Sichere Flags
−
cpuid
+
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!
 
</asm>
 
</asm>
−
Ein AMD-Prozessor hätte jetzt folgende Register Werte: EBX="'''Auth'''", EDX="'''enti'''", ECX="'''cAMD'''"
+
 
 +
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.
 +
<asm>
 +
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
 +
</asm>
 +
Ein '''AMD'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Auth'''", '''EDX'''="'''enti'''", '''ECX'''="'''cAMD'''"<br>
 +
Ein '''Intel'''-Prozessor hätte jetzt folgende Register Werte: '''EBX'''="'''Genu'''", '''EDX'''="'''ineI'''", '''ECX'''="'''ntel'''"
  
 
== Standard Funktionen ==
 
== Standard Funktionen ==