Без кейворда
При вызове инструкция CPUID по содержимому регистра EAX определяет какую информацию о процессоре необходимо вернуть. Вся информация, даже текстовая, возвращается в регистрах EAX, EBX, ECX и EDX. Поэтому, если их значения будут нужны для дальнейшей работы, то перед вызовом СPUID их надо сохранить. При EAX=0 CPUID возвращает в регистрах EBX, ECX и EDX идентификатор производителя процессора (Vendor ID) в виде 12 символов ASCII. В приведенной ниже табличке список самых распространенных идентификаторов производителей процессоров.
ASCII-строкаHEX-значения EBX:EDX:ECXПроизводительGenuineIntel756E6547:49656E69:6C65746EIntelAuthenticAMD68747541:69746E65:444D4163AMDCyrixInstead69727943:736E4978:64616574CyrixCentaurHauls746E6543:48727561:736C7561CentaurSiS SiS SiS20536953:20536953:20536953SiSNexGenDriven4778654E:72446E65:6E657669NexGenGenuineTMx86756E6547:54656E69:3638784DTransmetaRiseRiseRise65736952:65736952:65736952RiseUMC UMC UMC20434D55:20434D55:20434D55UMCGeode by NSC646F6547:79622065:43534E20National Semiconductor Но это лишь общее название производителя, а нам надо получить полное наименование. Для этого надо последовательно вызвать команду CPUID с параметрами в EAX = 80000002h, 80000003h и 80000004h. На каждый запрос в регистрах EAX:EBX:ECX:EDX будет возвращаться фрагмент 48-символьной строки полного наименования процессора, например, что-то типа Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz. Если строка короче 48 символов, то она будет дополняться пробелами, причем в разных местах. Для удобного получения строки названия процессора я написал вот такую функцию.
- ;-------------------------------------------------------------------
- ; Функция получения строки названия процессора
- ;-------------------------------------------------------------------
- ; Параметры:
- ; lpBuff - указатель на строку-приемник
- ; dFixString - надо ли чистить результат от лишних пробелов и
- ; заменять строки (TM) и (R) на отдельные символы
- ;-------------------------------------------------------------------
- proc GetCPUString lpBuff : DWORD , dFixString : DWORD
- pusha
- ; Указатель на строку-приемник
- movesi , [ lpBuff ]
- movedi , esi
- cld
- ; Прочитать информацию о процессоре
- moveax , 80000002h
- @ @ :
- pusheax
- cpuid
- stosd
- xchgeax , ebx
- stosd
- xchgeax , ecx
- stosd
- xchgeax , edx
- stosd
- popeax
- inceax
- cmpeax , 80000004h
- jbe @ b
- ; Привести строку к формату ASCIIZ
- xoreax , eax
- stosb
- ; Нужно ли чистить строку?
- cmp [ dFixString ] , 0
- je . loc_ret
- ; Почистить строку от лишних и неправильных символов
- movedi , esi
- @ @ :
- ; Убрать лидирующие пробелы, если они есть
- cmpbyte [ esi ] , ' '
- jne @ f
- incesi
- jmp @ b
- @ @ :
- xorebx , ebx
- . loc_clean_string :
- lodsb
- cmpal , ' '
- jnz @ f
- ; Убрать повторяющиеся пробелы
- cmpbl , 1
- je . loc_clean_string
- ; Установить флажок, что начались пробелы
- movbl , 1
- jmp . loc_store_char
- @ @ :
- ; Сбросить флажок пробелов
- movbl , 0
- ; Преобразовать символы "(R)" в один
- cmpal , '('
- jne @ f
- cmpword [ esi ] , 'R)'
- jne @ f
- ; ESI + 2
- lodsw
- ; Символ (R)
- moval , 0AEh
- jmp . loc_store_char
- @ @ :
- ; Преобразовать символы "(TM)" в один
- cmpdword [ esi - 1 ] , '(TM)'
- je @ f
- ; Написание может быть различным
- cmpdword [ esi - 1 ] , '(tm)'
- jne . loc_store_char
- @ @ :
- ; ESI + 3
- lodsw
- lodsb
- ; Символ (TM)
- moval , 099h
- . loc_store_char :
- ; Записать символ в строку
- stosb
- ; Конец строки достигнут?
- oral , al
- jnz . loc_clean_string
- ; Удалить финальный пробел если есть
- cmpbyte [ edi - 1 ] , ' '
- jne . loc_ret
- movbyte [ edi - 1 ] , 0
- . loc_ret :
- popa
- ret
- endp
Параметры вызова: lpBuff - указатель на строку-приемник в формате ASCIIZ, куда будет записано название процессора. Строка должна быть не менее 49 символов длиной с учетом финального нулевого символа. dFixString - заменять или нет в названии процессора текстовые строки "(TM)" и "(R)" на соответствующие символы, а также надо ли удалять из строки лишние пробелы (начальные, финальные, два и более пробелов подряд). Так, например, при вызове функции с параметром dFixString = TRUE, исходная строка Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz будет заменена на красивую строчку Intel® Core™ i7 CPU 920 @ 2.67GHz.
В приложении пример программы с исходным текстом, показывающей Vendor ID и полное название вашего процессора. Файл "x86 Architecture CPUID Manual" - подробное описание всех параметров команды CPUID и расшифровкой возвращаемых ей значений (на английском).