
Как на Ассемблере получить строку названия процессора
Для получения различной информации о процессоре используется ассемблерная команда CPUID. С ее помощью можно, например, узнать марку процессора и набор поддерживаемых им функций. На старых процессорах инструкция CPUID отсутствовала, поэтому во всех руководствах рекомендуют сперва проверить, что процессор ее поддерживает. Конечно, сейчас придется немало напрячься, чтобы найти такие древние компьютеры для ваших приложений, но порядок есть порядок. Итак, чтобы удостоверится, что команда CPUID доступна, достаточно попытаться изменить 21-й бит расширенного регистра EFLAGS. Если бит успешно поменяется, то инструкция CPUID процессором поддерживается, если регистр флагов остался без изменений, то процессор команду CPUID не поддерживает.Code (Assembler) : Убрать нумерацию
- ; Проверить, поддерживается ли команда CPUID
- pushfd
- pop eax
- ; Получить регистр флагов
- mov ebx,eax
- ; Изменить 21-й бит в регистре флагов
- xor eax, 200000h
- ; Сохранить и снова получить регистр флагов
- push eax
- popfd
- pushfd
- pop eax
- ; Регистр флагов изменился?
- cmp eax,ebx
- ; Нет, значит команда CPUID не поддерживается
- je cpuid_not_supported
| 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 |
Но это лишь общее название производителя, а нам надо получить полное наименование. Для этого надо последовательно вызвать команду CPUID с параметрами в EAX = 80000002h, 80000003h и 80000004h. На каждый запрос в регистрах EAX:EBX:ECX:EDX будет возвращаться фрагмент 48-символьной строки полного наименования процессора, например, что-то типа Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz. Если строка короче 48 символов, то она будет дополняться пробелами, причем в разных местах. Для удобного получения строки названия процессора я написал вот такую функцию.
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------
- ; Функция получения строки названия процессора
- ;-------------------------------------------------------------------
- ; Параметры:
- ; lpBuff - указатель на строку-приемник
- ; dFixString - надо ли чистить результат от лишних пробелов и
- ; заменять строки (TM) и (R) на отдельные символы
- ;-------------------------------------------------------------------
- proc GetCPUString lpBuff:DWORD, dFixString:D