; Procedura identyfikacji procesora ; ; Autor: Bogdan 'bogdro' Drozdowski ; Data/Wersja: 17.03.2006 %define wyswietlanie printf %define poz_x 0 %define poz_y 0 %define kolor 15 section .text extern wyswietlanie global _procesor ; ================================================== pisz2: pushfd push eax push ecx push edi push esi ; ta funkcja nic nie wyswietla, a dokleja kolejny napis z [ESI] do bufor_kom xor eax, eax mov edi, marka mov ecx, 128 cld repne scasb ; szukamy zera ; doklejamy napis: mov ecx, 127 dec edi .doklej: lodsb stosb test al, al jz .koniec loop .doklej .koniec: pop esi pop edi pop ecx pop eax popfd ret ; ================================================== _procesor: pushad pushfd call _procesor2 push dword poz_y push dword poz_x push dword kolor push dword marka call wyswietlanie add esp, 4*4 popfd popad ret ; ================================================== ; funkcja glowna, rozpoznajaca procesor ; ================================================== _procesor2: xor eax, eax mov edi, bufor_kom mov ecx, 128/4 cld repne stosd ; zerowanie napisu ; mov esi, procesor ; call pisz2 spr_386: ; i386: nie mozna zmienic bitu 18 flag (=0?) mov bp, 386 mov edx, esp and esp, ~3 ; aby uniknac AC fault pushfd pop eax mov ecx, eax xor eax, 40000h push eax popfd pushfd pop eax ; przywracamy bit AC pushfd pop ebx xor ebx, 40000h push ebx popfd xor eax, ecx ;xor eax,ecx : wyjdzie zero, jesli sie nie zmienil mov esp, edx jz procesor_juz ;486: nie mozna zmienic bitu 21 we flagach mov bp, 486 pushfd pop eax mov ecx, eax xor eax, 200000h push eax popfd pushfd pop eax xor eax, ecx jz procesor_juz ;586: mozna zmienic bit 21 we flagach, czyli uzyc CPUID xor eax, eax cpuid mov edi, eax ; EDI = maksymalny numer CPUID mov [bufor_kom], ebx mov [bufor_kom+4], edx mov [bufor_kom+8], ecx mov byte [bufor_kom+12], 0 ;na wszelki wypadek ; push dword 0 ; push ecx ; push edx ; push ebx mov esi, bufor_kom ; mov esi, esp call pisz2 ; wyswietlamy marke procesora, np. AuthenticAMD ; add esp, 4*4 test edi, edi ; EDI == 0? jnz edi_ge_1 ret edi_ge_1: mov eax, 1 cpuid mov ebx, eax ; mov esi,model_proc ; call pisz2 ; mov ax,bx ; shr ax,8 mov al, bh mov cl, al cmp al, 0fh ;jesli rodzina=1111b, to P4 jnz niep4 mov esi, p786_1 call pisz2 jmp model_juz ; ----------------------------- ; sprawdzanie 486 niep4: mov eax, ebx shr al, 4 and al, 0fh ; call pc ; and al, 0fh ;z powrotem na liczbe 0-15 (nie na cyfre) cmp cl, 3 jz model_juz cmp byte [bufor_kom],'C' jnz niep4_1 jmp p_nie_A niep4_1: cmp cl, 4 ja nie_cztery test al, al jnz p4_nie_0 mov esi, p486_1 call pisz2 p4_nie_0: cmp al, 1 jnz p4_nie_1 mov esi, p486_2 call pisz2 jmp model_juz p4_nie_1: cmp al,2 jnz p4_nie_2 mov esi, p486_3 call pisz2 jmp model_juz p4_nie_2: cmp al, 3 jnz p4_nie_3 mov esi, p486_4 call pisz2 jmp model_juz p4_nie_3: cmp al, 4 jnz p4_nie_4 mov esi, p486_5 call pisz2 jmp model_juz p4_nie_4: cmp al, 5 jnz p4_nie_5 mov esi, p486_6 call pisz2 jmp model_juz p4_nie_5: cmp al, 7 jnz p4_nie_6 mov esi, p486_7 call pisz2 jmp model_juz p4_nie_6: cmp al, 8 jnz p4_nie_7 mov esi, p486_8 call pisz2 jmp model_juz p4_nie_7: cmp al, 9 jnz p4_niezn mov esi, p486_9 call pisz2 jmp model_juz p4_niezn: mov esi, p_niezn call pisz2 jmp model_juz ; ----------------------------- ; sprawdzanie 586 nie_cztery: cmp byte [bufor_kom],'G' ;GenuineIntel jnz p_nie_I cmp cl, 5 ja nie_piec cmp al, 1 jnz p5_nie_1 mov esi, p586_1 call pisz2 jmp model_juz p5_nie_1: cmp al, 2 jnz p5_nie_2 mov esi, p586_2 call pisz2 jmp model_juz p5_nie_2: cmp al, 3 jnz p5_nie_3 mov esi, p586_3 call pisz2 jmp model_juz p5_nie_3: cmp al, 4 jnz p5_nie_4 mov esi, p586_4 call pisz2 jmp model_juz p5_nie_4: cmp al, 7 jnz p5_nie_7 mov esi, p586_5 call pisz2 jmp model_juz p5_nie_7: cmp al, 8 jnz p4_niezn mov esi, p586_6 call pisz2 jmp model_juz ; ----------------------------- ; sprawdzanie 686 nie_piec: cmp cl, 6 jna nie_piec_1 jmp nie_szesc nie_piec_1: cmp al, 1 jnz p6_nie_1 mov esi, p686_1 call pisz2 jmp model_juz p6_nie_1: cmp al, 3 jnz p6_nie_3 ;PII lub Xeon cmp edi, 1 jz bez_spr mov eax, 2 cpuid cmp dl, 44h ;sprawdzam ilosc L2 cache jb bez_spr ;czyli P II mov esi, p686_xeon call pisz2 jmp model_juz bez_spr: mov esi, p686_2 call pisz2 jmp model_juz p6_nie_3: cmp al, 5 jnz p6_nie_5 ;P II lub Celeron cmp edi, 1 jz bez_spr2 mov eax, 2 cpuid cmp dl, 44h ;sprawdzam ilosc L2 cache jae bez_spr2 mov esi, p686_4 ;Celeron call pisz2 jmp model_juz bez_spr2: mov esi, p686_3 ;P2 call pisz2 jmp model_juz p6_nie_5: cmp al, 6 jnz p6_nie_6 ;Celeron lub P II Mobile cmp edi, 1 jz bez_spr3 mov eax, 2 cpuid cmp dl, 41h jz Cel_MobCel mov esi, p686_p2m call pisz2 jmp model_juz Cel_MobCel: mov eax, 1 cpuid and al, 0fh cmp al, 0ah je CelMob cmp al, 0dh je CelMob bez_spr3: mov esi, p686_4 call pisz2 jmp model_juz CelMob: mov esi, p686_cm call pisz2 jmp model_juz p6_nie_6: cmp al, 7 jnz p6_nie_7 ;P III lub P3Xeon cmp edi, 1 jz bez_spr4 mov eax, 2 cpuid cmp dl, 44h jb bez_spr4 ;zwykly P3 mov esi, p686_p3x call pisz2 jmp model_juz bez_spr4: mov esi, p686_5 call pisz2 jmp model_juz p6_nie_7: cmp al, 8 jnz p6_nie_8 jednakp3: cmp edi, 1 jz bez_spr5 mov eax, 2 cpuid cmp dl, 44h jb bez_spr5 ;zwykly P3 mov esi, p686_p3x call pisz2 jmp model_juz bez_spr5: mov esi, p686_6 call pisz2 jmp model_juz p6_nie_8: cmp al, 0ah jz jednakp3 p6_niezn: mov esi, p_niezn call pisz2 jmp model_juz nie_szesc: cmp al, 1 jnz p6_niezn mov esi, p786_1 call pisz2 jmp model_juz ; ------------------------------------------- ; sprawdzanie AMD p_nie_I: cmp byte [bufor_kom], 'A' ;AuthenticAMD jz p_nie_A_1 jmp p_nie_A p_nie_A_1: cmp cl, 5 jna p_nie_A_2 jmp a_nie_piec p_nie_A_2: test al, al jnz a5_nie_0 mov esi, a586_1 call pisz2 jmp model_juz a5_nie_0: cmp al, 1 jnz a5_nie_1 mov esi, a586_2 call pisz2 jmp model_juz a5_nie_1: cmp al, 2 jnz a5_nie_2 mov esi, a586_2_2 call pisz2 jmp model_juz a5_nie_2: cmp al, 3 jnz a5_nie_3 mov esi, a586_2_3 call pisz2 jmp model_juz a5_nie_3: cmp al, 14 jnz a5_nie_4 ;tutaj zmienione, bylo "jnz a5_nie_14" mov esi, a586_3 call pisz2 jmp model_juz a5_nie_4: ; cmp al, 6 ;tutaj fragment skopiowany z jnz a5_nie_6 ;rodziny 686, bo te sa rozpoznawane mov esi, a686_1 ;jako z rodziny 5. call pisz2 ; jmp model_juz ; a5_nie_6: ; cmp al, 7 ; jnz a5_nie_7 ; mov esi, a686_1_2 call pisz2 jmp model_juz a5_nie_7: cmp al, 8 ; jnz a5_nie_8 ; mov esi, a686_2 ; call pisz2 ; jmp model_juz ; a5_nie_8: ; cmp al, 9 ; jnz a5_nie_9 ; mov esi, a686_3 ; call pisz2 ; jmp model_juz ; a5_nie_9: cmp al, 13 jnz a5_nie_13 ;K6-II+ lub K6-III+ cmp edi, 1 jz bez_spr6 mov eax, 2 cpuid cmp dl, 41h jz bez_spr6 cmp dl, 42h jnz a_niezn mov esi, a586_5_2 call pisz2 jmp model_juz bez_spr6: mov esi, a586_5 call pisz2 jmp model_juz a5_nie_13: cmp al, 15 jnz a_niezn mov esi, a586_4 call pisz2 jmp model_juz a_niezn: mov esi, p_niezn call pisz2 jmp model_juz a_nie_piec: cmp cl, 6 jnz a_nie_szesc test al, al jnz a6_nie_0 mov esi, a686_k7es call pisz2 jmp model_juz a6_nie_0: cmp al, 1 jnz a6_nie_1 mov esi, a686_ath1 call pisz2 jmp model_juz a6_nie_1: cmp al, 2 jnz a6_nie_2 mov esi, a686_ath2 call pisz2 jmp model_juz a6_nie_2: cmp al, 3 jnz a6_nie_3 mov esi, a686_d call pisz2 jmp model_juz a6_nie_3: cmp al, 4 jnz a6_nie_4 mov esi, a686_ath4 call pisz2 jmp model_juz a6_nie_4: cmp al, 6 jnz a6_nie_6 wroc2: mov esi, a686_1 call pisz2 jmp model_juz a6_nie_6: cmp al, 7 jz wroc2 cmp al, 8 jnz a6_nie_8 mov esi, a686_2 call pisz2 jmp model_juz a6_nie_8: cmp al, 9 jnz a_niezn mov esi, a686_3 call pisz2 jmp model_juz a_nie_szesc: cmp cl, 7 jnz a_niezn cmp al, 1 jnz a_niezn mov esi, a786_1 call pisz2 jmp model_juz ; ------------------------------------------- ; sprawdzanie Cyrix p_nie_A: cmp word [bufor_kom],'Cy' ;CyrixInstead jnz p_nie_C cmp cl, 4 jnz c_nie_4 test al, al jnz c4_nie_0 c4_1: mov esi, c486_1 call pisz2 jmp model_juz c4_nie_0: cmp al, 1 jz c4_1 cmp al, 4 ;moze sie tu zapodziac MediaGX jnz c_niezn mov esi, c686_2 call pisz2 jmp model_juz c_niezn: mov esi, p_niezn call pisz2 jmp model_juz c_nie_4: cmp cl, 5 jnz c_nie_5 ;dochodza procesory z rodziny 686 test al, al jnz c5_nie_0 mov esi, c686_4 call pisz2 jmp model_juz c5_nie_0: cmp al, 5 jnz c5_nie_5 mov esi, c686_via3 call pisz2 jmp model_juz c5_nie_5: cmp al, 2 jnz c_niezn mov esi, c586_1 call pisz2 jmp model_juz c_nie_5: cmp cl, 6 jnz c_niezn test al, al ;identyczne jak wyzej, teraz w 686 jnz c6_nie_0 mov esi, c686_4 call pisz2 jmp model_juz c6_nie_0: cmp al, 5 jnz c6_nie_5 mov esi, c686_via3 call pisz2 jmp model_juz c6_nie_5: cmp al, 3 jnz c6_nie_3 mov esi, c686_1 call pisz2 jmp model_juz c6_nie_3: cmp al, 4 jnz c6_nie_4 mov esi, c686_2 call pisz2 jmp model_juz c6_nie_4: cmp al, 5 jnz c6_nie_5_2 mov esi, c686_3 call pisz2 jmp model_juz c6_nie_5_2: cmp al, 6 ; AL=4 mialoby wskazywac na 2 rozne procesory? jnz c_niezn mov esi, c686_4 call pisz2 jmp model_juz ; ------------------------------------------- ; sprawdzanie Rise Technology p_nie_C: cmp byte [bufor_kom],'R' ;Rise jnz p_nie_R cmp cl, 6 jnz r_niezn cmp al, 0 jnz r6_nie_0 r_mp6: mov esi, r686_1 call pisz2 jmp model_juz r6_nie_0: cmp al, 2 jz r_mp6 cmp al, 8 jnz r_niezn mov esi, r686_2 call pisz2 jmp model_juz r_niezn: mov esi, p_niezn call pisz2 jmp model_juz ; ------------------------------------------- ; sprawdzanie IDT p_nie_R: cmp word [bufor_kom],'Ce' ;IDT - EBX=746E6543h jnz p_nie_IDT cmp cl, 5 jnz r_niezn cmp al, 4 jnz i5_nie_4 mov esi, i586_1 call pisz2 jmp model_juz i5_nie_4: cmp al, 8 jnz i5_nie_8 mov eax, 1 cpuid and al, 0fh cmp al, 5 jnz i58_nie_5 jednak58_5: mov esi, i586_2 call pisz2 jmp model_juz i58_nie_5: cmp al, 0ah jz jednak58_5 cmp al, 7 jz i58_7 cmp al, 8 jz i58_7 cmp al, 9 jz i58_7 jmp r_niezn i58_7: mov esi, i586_3 call pisz2 jmp model_juz i5_nie_8: cmp al, 9 jnz i5_nie_9 mov esi, i586_4 call pisz2 jmp model_juz i5_nie_9: cmp al, 0ah jnz r_niezn mov esi, i586_5 call pisz2 jmp model_juz ; ------------------------------------------- ; sprawdzanie Transmety p_nie_IDT: cmp byte [bufor_kom],'M' ;Transmeta - ECX(?)=3638784Dh jnz p_nie_T cmp edi, 1 jbe model_juz ;nie da sie okreslic modelu mov eax, 2 cpuid cmp dl, 42h jnz t_nie42 mov esi, t586_1 call pisz2 jmp model_juz t_nie42: cmp dl, 43h jnz t_nie43 mov esi, t586_2 call pisz2 jmp model_juz t_nie43: cmp dl, 44h jnz r_niezn mov esi, t586_3 call pisz2 jmp model_juz p_nie_T: ; nie bedziemy mowic, ze nie znamy typu procesora... mov esi, niezn_firma call pisz2 model_juz: ret procesor_juz: xor eax, eax mov ax, bp mov bx, 100 xor dx, dx div bx xor ah, ah ; EAX = iloraz mov esi, cyfry add esi, eax add esi, eax ; SI -> cyfra call pisz2 mov esi, osiem_szesc call pisz2 ret ; ========================================================================= section .data ;lancuchy znakow producentow ( Cpuid 0) ;Intel 'GenuineIntel' ;AMD 'AuthenticAMD' ;Cyrix 'CyrixInstead' ;UMC 'UMC UMC UMC ' ;ostatni NexGen 'NexGenDriven' ;Centaur Technology 'CentaurHauls' (IDT) ;Rise Technology 'RiseRiseRise' procesor db 'Procesor: ', 0 p486_1 db ' - 486 DX-25/33', 0 p486_2 db ' - 486 DX-50', 0 p486_3 db ' - 486 SX', 0 p486_4 db ' - 486 DX/2', 0 p486_5 db ' - 486 SL', 0 p486_6 db ' - 486 SX/2', 0 p486_7 db ' - 486 DX/2-WB', 0 p486_8 db ' - 486 DX/4', 0 p486_9 db ' - 486 DX/4-WB', 0 p_niezn db ' - model nieznany', 0 p586_1 db ' - Pentium 60/66', 0 p586_2 db ' - Pentium 75-200', 0 p586_3 db ' - Pentium OverDrive PODP5V83', 0 p586_4 db ' - Pentium MMX', 0 p586_5 db ' - Mobile Pentium', 0 p586_6 db ' - Mobile Pentum MMX', 0 p686_1 db ' - Pentium PRO', 0 p686_2 db ' - Pentium II (P6L Klamath)', 0 p686_3 db ' - Pentium II (P6L Deschutes)', 0 p686_4 db ' - Celeron (P6C Mendocino)', 0 p686_5 db ' - Pentium III (P6K Katmai)', 0 p686_6 db ' - Pentium III', 0 p686_xeon db ' - Pentium II Xeon', 0 p686_p2m db ' - Pentium II Mobile', 0 p686_cm db ' - Celeron Mobile', 0 p686_p3x db ' - Pentium III Xeon', 0 p786_1 db ' - Pentium 4 (Williamette)', 0 niezn_firma db ' , nieznany producent', 0 a586_1 db ' - K5/SSA5 (K5 Model 0)', 0 a586_2 db ' - K5 Model 1', 0 a586_2_2 db ' - K5 Model 2', 0 a586_2_3 db ' - K5 Model 3', 0 a586_3 db ' - Am5x86-WT', 0 a586_4 db ' - Am5x86-WB', 0 a586_5 db ' - AMD K6-II+ lub K6-III+ (Model D)', 0 a586_5_2 db ' - K6-III+ (Model D)', 0 a686_1 db ' - K6 Model 6', 0 a686_1_2 db ' - K6 Model 7', 0 a686_2 db ' - K6-2 Model 8', 0 a686_3 db ' - K6-III Model 9', 0 a686_k7es db ' - Athlon K7 ES', 0 a686_ath1 db ' - Athlon 1', 0 a686_ath2 db ' - Athlon 2', 0 a686_ath4 db ' - Athlon 4', 0 a686_d db ' - Duron', 0 a786_1 db ' - Athlon (K7)', 0 c486_1 db ' - Cx486', 0 c586_1 db ' - M 1 (5x86)', 0 c686_1 db ' - 6x86', 0 c686_2 db ' - MediaGX (lub M II?)', 0 c686_3 db ' - 6x86MX', 0 c686_4 db ' - M II', 0 c686_via3 db ' - VIA III', 0 r686_1 db ' - mP6', 0 r686_2 db ' - mP6-II', 0 i586_1 db ' - IDT WinChip C6', 0 i586_2 db ' - IDT WinChip 2', 0 i586_3 db ' - IDT WinChip 2 Rev. A', 0 i586_4 db ' - IDT WinChip 3', 0 i586_5 db ' - IDT WinChip 4', 0 t586_1 db ' - Transmeta 5400', 0 t586_2 db ' - Transmeta 5600', 0 t586_3 db ' - Transmeta 5800', 0 bufor_kom: times 128 db 0 marka: times 128 db 0 cyfry: %assign i 0 %rep 10 db i+'0', 0 %assign i i+1 %endrep osiem_szesc db "86", 0 ; reszta napisu procesora *86