CPUID
Ця стаття не містить посилань на джерела. (березень 2017) |
CPUID (CPU Identification) — асемблерна мнемоніка інструкції процесорів x86, використовується для отримання інформації про процесор. Використовуючи її, програма може визначити тип процесора і його можливості (наприклад, можна визначити, які розширення набору інструкцій підтримуються).
Інструкція CPUID вперше з'явилася в процесорах Intel 80486. Потім вона була включена усіма процесорами, починаючи з Intel 486DX/SX/DX2 SL, AMD 486DX4, Cyrix 6x86 (M1), UMC U5S.
Код операції: 0F A2.
Так як інструкція 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]
- ↑ CPUID — CPU Identification. felixcloutier.com (англ.). Архів оригіналу за 14 травня 2020. Процитовано 25 лютого 2020.
Це незавершена стаття про апаратне забезпечення. Ви можете допомогти проєкту, виправивши або дописавши її. |