format pe console
include 'win32ax.inc'
entry start
;---------
.data
archtable dw 0x006d, 0x006e, 0x006f, 0x00f2, 0x1067, 0x106a, 0x106e, 0x206c
dw 0x2065, 0x206e, 0x206f, 0x3067, 0x216a, 0x206d, 0x316a, 0x306e
dw 0x316c, 0x316f, 0x4165, 0x4066, 0x316d, 0x4167, 0x416f, 0x5066
dw 0x416e, 0x5165, 0x506e, 0x00f4, 0x506c, 0x806e, 0x906e, 0x706a
dw 0x406a, 0x406c, 0x406d, 0x5067, 0x506c, 0x506a, 0x506f, 0x606e
; 0x?1?? - флаг повтора строки (т.е. когда имя архитектуры для следующего кода то же)
archtablelen = ($-archtable)/2
archnames:
doеhan db 'Dothan',0
yonah db 'Yonah',0
conroe db 'Conroe',0
netburst db 'NetBurst',0
wolfdale db 'Wolfdale',0
bloomfield db 'Bloomfield',0
lynnfield db 'Lynnfield',0
gulftown db 'Gulftown',0
arrandale db 'Arrandale',0
nehalem db 'Nehalem',0
westmere db 'Westmere',0
silvermont db 'Silvermont',0
sandybridge db 'Sandy Bridge',0
ivybridge db 'Ivy Bridge',0
haswell db 'Haswell',0
broadwell db 'Broadwell',0
skylake db 'Sky Lake',0
prescott db 'Prescott',0
apollolake db 'Apollo Lake',0
kabylake db 'Kaby Lake',0
coffeelake db 'Coffee Lake',0
geminilake db 'Gemini Lake',0
merrifield db 'Merrifield',0
cherryview db 'Cherry View',0
avoton db 'Avoton',0
phiknights db 'Phi Knights',0
broxton db 'Broxton',0
moorefield db 'Moorefield',0
denverton db 'Denverton',0
cougarmount db 'Cougar Mountain',0
unknown db 'Unknown',0
;//---------
.code
start: mov eax,1
cpuid
push eax
shr eax,4 ; Stepping не нужен
and ah,0xF0 ; Type тоже не нужен
xchg ebx,eax ; EBX = Family/Model
cld
mov edi,archnames ; имена микроархитектур
mov esi,archtable ; таблица
mov edx,archtablelen ; кол-во элементов таблицы
xor eax,eax ; обнуляем старшую часть EAX
.next: lodsw
mov ecx,eax ; CH and 1 = флаг повтора строки
and ah,0xF0 ; удаляем флаг повтора строки
cmp ebx,eax ; проверяем код из таблицы
je .found
shr ch,1 ; проверяем флаг повтора строки
jc @F ; та же строка
salc ; AL = 0
repne scasb ; пропускаем строку (ECX достаточно велик)
@@: dec edx
jnz .next
.found:
pop eax ; код Family/Model/Stepping
cinvoke printf,<'CPUID code: %X --> %s',10>, eax, edi
cinvoke getch
cinvoke exit,0
;//**********************************
section '.idata' import data readable
library msvcrt,'msvcrt.dll'
import msvcrt, printf,'printf',exit,'exit',getch,'_getch'