CPUID

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

Инструкция CPUID впервые появилась в процессорах i486. Потом она была включена во все процессоры, начиная с 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.

Некоторые идентификаторы производителей процессоров:[1]

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
Vortex86 SoC 74726F56:36387865:436F5320 DM&P Electronics

Примечания

[править | править код]
  1. Тасит Мурки, Станислав Гарматюк. VIA Nano как инструмент для исследователя. iXBT (11 августа 2010). Дата обращения: 16 сентября 2010. Архивировано 15 августа 2010 года.