Assembleur 80x86 | CPUID |
---|---|
INTEL Pentium | Central Processor Unit IDentificator |
Syntaxe
CPUID |
Description
Cette instruction retourne le code d'identification du microprocesseur dans les 4 registres suivants: EAX, EBX, ECX, EDX. Tout d'abord, si EAX = 0 lors de l'appel alors EAX retourne le nombre maximal d'entrée d'EAX et EBX:EDX:ECX retourne la chaîne de caractères "GenuineIntel" si s'est un microprocesseur du fabricant INTEL (soit EBX = "Genu", EDX = "ineI", ECX = "ntel"). Si EAX = 1 lors de l'appel alors EAX contient le drapeau de fourniture fixée si les instructions CMPXCHG8B, CMOV, FCMOV, FCMOVB sont supportée. Le bit 23 est fixée si les instructions MMX sont supportés. Si EAX = 2 lors de l'appel alors les 4 registres: EAX, EBX, ECX et EDX contient les informations concernant le cache et les TLBs (Translation Lookahead Buffers).
Algorithme
MODULE CPUID ÉVALUER EAX CAS 0: EAX ← hv EBX ← chaîne de caractères d'identification du fabricant : Intel: 756E6547h ("Genu") AMD: 68747541h ("Auth") Cyrix: 69727943h ("Cyri") EDX ← chaîne de caractères d'identification du fabricant : Intel: 49656E69h ("ineI") AMD: 69746E65h ("enti") Cyrix: 736E4978h ("xIns") ECX ← chaîne de caractères d'identification du fabricant : Intel: 6C65746Eh ("ntel") AMD: 444D4163h ("cAMD") Cyrix: 64616574h ("tead") CAS 1: EAX[0 à 3] ← Identification de niveau SI Intel ou AMD ALORS EAX[4 à 7] ← Modèle EAX[8 à 11] ← Famille EAX[12 à 31] ← réservée SINON Cyrix ALORS EAX[8 à 15] ← 6 FIN SI EBX ← 0 ECX ← Drapeau de fourniture supplémentaire : Bit[0] ← SSE3: Extension d'ensemble d'instructions SSE3 supporté? Bit[5] ← VMX: Extension d'ensemble d'instructions VMX supporté? Bit[6] ← SMX: Extension d'ensemble d'instructions SMX supporté? Bit[9] ← SSSE3: Extension d'ensemble d'instructions SSSE3 supporté? Bit[13] ← Instruction CMPXCHG16B supporté? Bit[19] ← SSE4.1: Extension d'ensemble d'instructions SSE4.1 supporté? Bit[20] ← SSE4.2: Extension d'ensemble d'instructions SSE4.2 supporté? Bit[27] ← Instruction OSXSAVE (XGETBV, XRSTOR, XSAVE, XSETBV) supporté? EDX ← Drapeau de fourniture: Bit[0] ← FPU: Coprocesseur mathématique présent Bit[1] ← CYRIX: VME: Supporte le mode Virtuel 8086 Bit[2] ← DE: Point d'arrêt aux Entrées/Sorties Bit[3] ← CYRIX: PSE: Extension de taille de page Bit[4] ← TSC: Compteur "Time Stamp" Bit[5] ← MSR: CPU de style Pentium Bit[6] ← CYRIX: PTE: Extension d'adresse physique, INTEL: PAE: Extension d'adresse physique Bit[7] ← MCE: Vérification d'exception machine Bit[8] ← CX8: CMPXCHG8B supportée? Bit[9] ← CYRIX: APIC Bit[11] ← SEP: Fourniture de d'appel rapide système (Pentium Pro+) Bit[12] ← MTRR: CYRIX: Type de registres de rangé mémoire Bit[13] ← PGE: Bit global PTE Bit[14] ← CYRIX: MCA: Vérification de l'architecture machine supporté? Bit[15] ← CMOV: Les instructions CMOV, FCMOV,... sont supportés? Bit[16] ← PAT: Table d'attribut de page Bit[17] ← PSE36: Microprocesseur support des pages de 4 Mo pour l'accès à la haute mémoire 2 Go Bit[18] ← SN: Support le numéro de série du microprocesseur Bit[19] ← Instruction CLFLUSH supporté? Bit[23] ← MMX: Instruction MMX supporté? Bit[24] ← FXSR: Sauvegarde/restauration rapide du microprocesseur (IA MMX-2) Bit[25] ← SSE: Extension d'ensemble d'instructions SSE, alias MMX2/KNI, supporté? Bit[26] ← SSE2: Instruction LFENCE, MFENCE, MOVNTI,... supporté? CAS 2: SI (Pentium III ou plus) ou (Cyrix MediaGX MMX Enhanced) ALORS EAX, EBX, ECX, EDX ← Les 4 type de cache de l'architecture du microprocesseur: 00h: Aucun 01h: Instruction TLB, 4 Ko par page, 4 routes, 64 entrées 02h: Instruction TLB, 4 Mo par page, 4 routes, 4 entrées 03h: Donnée TLB, 4 Ko par page, 4 routes, 64 entrées 04h: Donnée TLB, 4 Mo par page, 4 routes, 8 entrées 06h: Cache d'instruction, 8 Ko, 4 routes, 32 octets par ligne 08h: Cache d'instruction, 16 Ko, 4 routes, 32 octets par ligne 0Ah: Cache d'instruction, 8 Ko, 2 routes, 32 octets par ligne 0Ch: Cache d'instruction, 16 Ko, 2 routes, 32 octets par ligne 40h: Pas de cache L2 41h: Cache L2 unifié, 32 octets par ligne, 4 routes, 128 Ko 42h: Cache L2 unifié, 32 octets par ligne, 4 routes, 256 Ko 43h: Cache L2 unifié, 32 octets par ligne, 4 routes, 512 Ko 44h: Cache L2 unifié, 32 octets par ligne, 4 routes, 1 Mo 45h: Cache L2 unifié, 32 octets par ligne, 4 routes, 2 Mo SI Cyrix MediaGX MMX Enhanced ALORS 70h: Entrée 32 bits TLB, 4 routes, Cache de 4 Ko 80h: Cache de 4 routes associative L1, 16 octets par ligne FIN SI SINON EAX ← non-défini EBX ← non-défini ECX ← non-défini EDX ← non-défini FIN SI CAS 3: SI (Pentium III ou plus) ALORS EDX:ECX ← Partie basse de 64 bits du numéro de série de 96 bits du microprocesseur SINON EAX ← non-défini EBX ← non-défini ECX ← non-défini EDX ← non-défini FIN SI CAS 5: SI Intel ALORS EAX ← MONITOR/MWAIT FIN SI CAS 6: SI sonde de température supporté ALORS EAX ← 1 SINON EAX ← 0 FIN SI CAS 80000000h: SI (AMD K5 sauf SSA/5, AMD K6 ou Cyrix GXm) ou (Pentium 4 ou plus) ALORS EAX ← Valeur maximal de la fonction contenu dans le registre EAX reconnu par l'instruction CPUID (Exemple AMD 5k86 (K5) = 80000005h) SINON EAX ← non-défini FIN SI EBX ← non-défini ECX ← non-défini EDX ← non-défini CAS 80000001h: SI (AMD K5, AMD K6, Cyrix GXm ou IDT Winchip 2) ALORS EAX ← Signature du microprocesseur AMD 0000051Xh: AMD 5k86 (K5 sauf SSA/5) 0000066Xh: AMD 6k86 (K6) EDX ← Drapeaux des fournitures étendues: Bit[0] ← FPU: Coprocesseur arithmétique inclue dans la puce du microprocesseur Bit[1] ← VME: Extension de mode Virtual présent Bit[2] ← DE: Extensions de déboguage Bit[3] ← PSE: CPU support la tailles de pages de 4 Mo Bit[4] ← TSC: TSC présent (Voir l'instruction RDTSC) Bit[5] ← MSR: CPU est compatible MSR du K5 ou compatibilité MSR du Cyrix Bit[6] ← PAE: Extensions de page d'adresse Bit[7] ← MCE: Vérification d'exception machine Bit[8] ← CX8: Support l'instruction CMPXCHG8B Bit[9] ← APIC: CPU a un APIC local (doit être activé) Bit[10] ← Réservé Bit[11] ← Instruction SYSCALL et SYSRET Bit[12] ← MTRR: Registres de type de rang mémoire (Memory Type Range Registers) Bit[13] ← Extensions de pagination global (PTE-PGE) Bit[14] ← MCA: Architecture de vérification machine Bit[15] ← CMOV: Le CPU support les instructions CMOV Bit[16] ← FCMOV: Le CPU support les instructions FCMOV Bit[17] ← PSE: Extension de taille de Page Bit[21..18] ← Réservé Bit[22] ← MMXE: CPU Support les extensions d'instructions MMX (AMD Athlon) Bit[23] ← MMX: CPU support IA MMX Bit[24] ← (Cyrix) Cyrix supporte l'extension MMX Bit[24] ← (AMD) Support les instructions FXSAVE/FXRSTOR Bit[29..25] ← Réservé Bit[30] ← CPU support les instructions étendue 3DNow! Bit[31] ← Support l'AMD 3DNow! SINON EAX ← non-défini EDX ← non-défini FIN SI EBX ← non-défini ECX ← Drapeau de fourniture supplémentaire: Bit[0] ← Instruction LAHF est supporté en mode 64 bits? Bit[2] ← Les instructions SVM (CLGI,...) sont supportés? Bit[5] ← Instruction LZCNT supporté? Bit[8] ← Instruction PREFETCH du «3DNow! Prefetch» supporté? CAS 80000002h,80000003h,80000004h: SI (AMD K5, AMD K6 ou Cyrix GXm) ALORS EAX, EBX, ECX, EDX ← Nom du CPU sous forme d'une chaîne de caractères (si AMD K5, en format BIG-Endian) SINON EAX ← non-défini EBX ← non-défini ECX ← non-défini EDX ← non-défini FIN SI CAS 80000008h: EAX ← Demande des informations sur la taille des adresses et le compteur de coeur physique: Bit[23..16] ← Demande la taille maximal physique invité d'octets en bits Bit[15..8] ← Demande la taille maximal linéaire d'une adresse d'octets en bits Bit[7..0] ← Demande la taille maximal physique d'octets en bits ECX ← NC: Demande le nombre de coeur que comprendre le microprocesseur - 1. AUTREMENT: EAX ← non-défini EBX ← non-défini ECX ← non-défini EDX ← non-défini FIN ÉVALUER |
Remarque
- Voici la table des fournitures standard retourner par le registre EAX=1 de l'instruction CPUID en fonction des différents fabricants:
Registre EDX | Nom | Cyrix 6x86 | Cyrix 6x86L | Cyrix GX | Cyrix 6x86MX | Cyrix MII | Cyrix GXm | AMD C6 | AMD C2 | AMD K5 | AMD K6 | AMD K6-2 | AMD K6-III | AMD Athlon | INTEL Pentium | INTEL Pentium MMX | INTEL Pentium Pro | INTEL Pentium II | INTEL Pentium III | INTEL Pentium Celeron |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit[0] | FPU | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[1] | VME | - | - | - | - | - | - | - | - | + | + | + | + | + | + | + | + | + | + | + |
Bit[2] | DE | - | + | - | + | + | - | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[3] | PSE | - | - | - | - | - | - | - | - | + | + | + | + | + | + | + | + | + | + | + |
Bit[4] | TSC | - | - | - | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[5] | MSR | - | - | - | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[6] | PAE | - | - | - | - | - | - | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[7] | MCE | - | - | - | - | - | - | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[8] | CX8 | - | + | - | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + | + |
Bit[9] | APIC | - | - | - | - | - | - | - | - | - | - | - | x | + | (1) | (1) | (1) | (1) | (1) | (1) |
Bit[10] | res | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | ? | - |
Bit[11] | SEP | - | - | - | - | - | - | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[12] | MTRR | - | - | - | - | - | - | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[13] | PGE | - | - | - | + | + | - | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[14] | MCA | - | - | - | - | - | - | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[15] | CMOV | - | - | - | + | + | + | - | - | - | - | - | - | + | - | - | + | + | + | + |
Bit[16] | PAT | - | - | - | - | - | - | - | - | - | - | - | - | + | - | - | - | (2) | + | + |
Bit[17] | PSE36 | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | (2) | + | + |
Bit[18] | SN | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | + | - |
Bit[23] | MMX | - | - | - | + | + | + | + | + | - | + | + | + | + | + | + | + | + | + | + |
Bit[24] | FXSR | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | (2) | + | + |
Bit[25] | SIMD | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | + | - |
(2) = Il commence à supporter les coeurs «Deschutes»
Mnémonique
Instruction | Opcode | Description |
---|---|---|
CPUID | 0Fh A2h | Retourne les informations à propos du microprocesseur et sa compatiblité. Le registre EAX correspond à un numéro de fonction et les données sont retournées dans les registres EAX, EBX, ECX et EDX. |
Exceptions
Aucune
Exemples
Cet exemple permet de tester la présence de l'instruction «CMPXCHG16B» avant de l'utiliser :
- MOV EAX,1
- CPUID
- BT ECX, 13 ; CPUID.1:ECX.CMPXCHG16B[bit 13] = 1: Est-ce que le CMPXCHG16B est disponible et actif pour l'utilisation d'application ?
- JNC @not_supported
- ; Mettre quelques instructions avant ici
- ; ...
- CMPXCHG16B OWord Ptr [RAX]
- ; Mettre quelques instructions après ici
- ; ...
- @not_supported:
Voici un exemple de la fonction d'API de Windows du nom de «GetCurrentProcessorNumber» sous un système d'exploitation Windows XP Professionnel à l'aide d'un code source avec un compilateur «Delphi 3» :
on obtiendra le résultat ressemblant à celui-ci sous «Windows XP Professionel» avec un AMD Phenom X4 :
Nombre de processus courant = 0Références
AMD CPUID Specification, Edition Advanced Micro Devices, Revision 2.28, April 2008, Publication No. 25481.
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 103 à 104.
The Undocumented PC: A programmer's Guide to I/O, CPUs, and Fixed Memory Areas - Second Edition, Edition Addison-Wesley, Frank van Gilluwe, 1997, ISBN: 0-201-47950-8, page 64 à 67.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 245 à 279.