| Zeile 1: | Zeile 1: | ||
| − | {{Achtung|Text= Dieser Artikel wird gerade generalüberholt. Bitte nimm keine Änderungen an diesem Artikel vor! | + | {{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 | + | 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 == | ||
| − | + | 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: | |
<asm> | <asm> | ||
| − | + | 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! | ||
</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 == | ||