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 Виробник
GenuineIntel 756E6547:49656E69:6C65746E Intel
AuthenticAMD 68747541:69746E65:444D4163 AMD
CyrixInstead 69727943:736E4978:64616574 Cyrix
CentaurHauls 746E6543:48727561:736C7561 Centaur
SiS SiS SiS 20536953:20536953:20536953 SiS
NexGenDriven 4778654E:72446E65:6E657669 NexGen
GenuineTMx86 756E6547:54656E69:3638784D Transmeta
RiseRiseRise 65736952:65736952:65736952 Rise
UMC UMC UMC 20434D55:20434D55:20434D55 UMC
Geode by NSC 646F6547:79622065:43534E20 National Semiconductor

Особливості[ред. | ред. код]

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

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]

  1. CPUID — CPU Identification. felixcloutier.com (англ.). Архів оригіналу за 14 травня 2020. Процитовано 25 лютого 2020.