CPUID

CPUID (CPU Identification) асемблерна мнемоніка інструкції процесорів x86, використовується для отримання інформації про процесор. Використовуючи її, програма може визначити тип процесора і його можливості (наприклад, можна визначити, які розширення набору інструкцій підтримуються).

Інструкція CPUID вперше з'явилася в процесорах Intel 80486. Потім вона була включена усіма процесорами, починаючи з Intel 486DX/SX/DX2 SL, AMD 486DX4, Cyrix 6x86 (M1), UMC U5S.

Код операції: 0F A2.

Перевірка підтримки інструкції CPUID процесором

Так як інструкція CPUID була відсутня в перших процесорах архітектури x86, перед її використанням слід упевнитися, що процесор її підтримує. Для цього проводиться спроба змінити біт 21 (ID) регістра EFLAGS. Якщо біт успішно поміняється, то інструкція CPUID доступна.

Асемблерний код для перевірки:

pushfd           ; EFLAGS розміщення регістра в стеку
pop eax          ; EFLAGS витяг значення в EAX
mov ebx, eax     ; збереження значення в EBX
xor eax, 200000h ; зміна 21-го біта
push eax         ; розміщення нового значення в стеку
popfd            ; збереження нового значення в EFLAGS
pushfd           ; EFLAGS знову розміщення в стеку
pop eax          ; значення EFLAGS тепер в EAX
xor eax, ebx     ; перевірка 21-го біта
je no_cpuid      ; якщо він не змінився, то CPUID не дозволені

Даний приклад використовує 32-бітові інструкції, тому якщо процесор знаходиться в 16-розрядному режимі, рекомендується спочатку перевірити, чи підтримує процесор такі інструкції (тобто чи працює код на процесорі 80386 або новіше).

Використання

Інструкція CPUID по вмісту регістра EAX визначає, якого роду інформацію про процесор необхідно повернути. Перший раз її слід викликати зі значенням EAX = 0. При цьому буде повернуто максимально допустиме значення параметра інструкції, підтримуване даним процесором.

Для того, щоб отримати інформацію про додаткові функції, наявних в процесорах, в регістрі EAX перед викликом CPUID повинен бути встановлений біт 31. Наприклад, щоб визначити максимально допустиме значення параметра для додаткових функцій, необхідно виконати CPUID із значенням EAX = 80000000h.

При EAX = 0 процесор повертає ідентифікатор виробника процесора (англ. Vendor ID) у вигляді 12 символів ASCII в регістрах EBX, EDX, ECX (саме в такому порядку). У регістрі EAX повертається максимально допустиме значення EAX при виклику CPUID.

Деякі ідентифікатори виробників процесорів:

ASCII-рядок HEX-значення EBX:EDX:ECX Виробник
GenuineIntel756E6547:49656E69:6C65746EIntel
AuthenticAMD68747541:69746E65:444D4163AMD
CyrixInstead69727943:736E4978:64616574Cyrix
CentaurHauls746E6543:48727561:736C7561Centaur
SiS SiS SiS 20536953:20536953:20536953SiS
NexGenDriven4778654E:72446E65:6E657669NexGen
GenuineTMx86756E6547:54656E69:3638784DTransmeta
RiseRiseRise65736952:65736952:65736952Rise
UMC UMC UMC 20434D55:20434D55:20434D55UMC
Geode by NSC646F6547:79622065:43534E20National Semiconductor

Особливості

У процесорах Intel 64 дана інструкція очищує верхню половину 64-розрядних регістрів RAX, RBX, RCX і RDX у всіх режимах роботи.[1]

Див. також

  • procfs#cpuinfo

Джерела

  1. CPUID — CPU Identification. felixcloutier.com (англ.).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.