|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:7 z5 |8 }/ k' Q( H+ g3 `! `6 R1 R) F
- H1 H6 h7 N2 W" H4 @8 B
Intel 486 以上的CPU,( x) G: r# g. V! y2 c7 o
Cyrix M1 以上的CPU,7 D1 @0 }9 t, f Y c) w
AMD Am486 以上的CPU
. I U5 u8 d$ @3 L6 |- @+ ]% }; p1 v6 q8 e8 M
(1) 取CPU OEM 字符串, 判断CPU 厂商
0 u# q4 ?8 a& _# E% p- H 先让EAX=0, 再调用CPUID ) p G7 f, k& a! t
Inel的CPU将返回: # y; a5 f& q, E% [
- a$ L7 k2 I" F! Y. X7 x3 X/ L3 A& M
EBX:756E6547H 'Genu'
! T" U# T4 K( h$ H8 p$ b5 CEDX:49656E69H 'ineI'
z2 A& C* c9 E, s7 c4 O7 ?- dECX:6C65746EH 'ntel'$ _ Z, z" a* f" _- [9 H
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
) w8 c, L7 d+ f: X9 \
; o7 Y: z) r# s0 Z4 C0 ] S# LCyrix 的CPU 将返回:
& T4 d9 R) b7 t. N3 T4 B9 J7 d5 C U1 E5 b
EBX:43797269H
5 ~- P7 D' c- u$ A% I- aEDX:78496E73H" G1 H8 E1 V" }6 Z$ ?
ECX:74656164H
' y$ r3 m% [( L, |"CyrixInstead","Cyrix 来代替"。+ i L, v3 h* m
# X! O* j+ _1 ~% HAMD 的CPU 将返回:( C4 J2 N$ s% b+ d/ o
% H( O. n1 B$ G' Z4 p5 j1 M7 v
EBX:41757468H
% ~" w! e/ H3 s9 y* q6 e& GEDX:656E7469H
/ l' a& N: }* Q ^! G5 c! HECX:63414D44H6 A, \. ]5 y- e2 E2 A
"AuthenticAMD", 可信的AMD。
" ^+ }8 ^+ P+ j% O# N/ q! {
. p2 g/ ~4 w& I) j- Q 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
6 c' S" X5 h: M5 ]2 B$ w
1 ~6 `7 t$ B/ }2 l' e Z (2)CPU 到底是几86, 是否支持MMX 0 p' j5 p, }! R7 V" V0 K% o* M
先让EAX=1,再调用CPUID ; L" Q, L; N. b9 s4 C; V* \
EAX的8到11位就表明是几86 6 x) A' S3 y! n; j# f* f% q# F
, D" _# G, P0 U* ]3 - 386
6 K- f( z: I" q, ^' U, L( \) ]$ j4 - i486
; ?6 x5 L0 F; _ Y+ c1 H( j5 - Pentium
! o: [4 |+ r* R" Z2 s# s1 z, ^6 - Pentium Pro Pentium II0 p- K# c/ j: U. n2 }7 P
2 - Dual Processors
% S2 I3 f) O: Y( F; U3 R" m! L* J" c
+ o' r) O t& c. f1 F EDX 的第0位:有无FPU$ p, d0 K9 r- Z( j9 F, v$ D
7 D7 T* s" q3 D; |* X5 \" D& A EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 / g! Q' P8 C8 |/ M9 w% M& ~
* M; d& d2 p& w9 o9 w (3) 专门检测是否P6架构
3 U1 E( W8 D6 K0 q4 ^; m 先让EAX=1,再调用CPUID
1 U% ]4 |% V+ k" {8 r 如果AL=1,就是Pentium Pro 或Pentium II . s4 i$ r, e" V- p0 S
(4) 专门检测AMD的CPU信息 7 R9 x( T W4 i8 I; O/ i
先让EAX=80000001H,再调用CPUID 9 w: T$ w2 C! F: R) z# O& x* ]
如果EAX=51H, 是AMD K5 5 k5 Z1 r% M5 O, g; o
如 果EAX=66H, 是K6 8 i9 \0 h3 m% k, Y7 ]; z0 H
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) % X2 `! N, a9 |3 |2 n
EDX 第23 位,CPU是否支持MMX,
) }# A9 O v m' y) H4 _/ Z/ ]5 q5 J. t) q* t% _
程序如下:
# }% c0 D# ^. M# k/ ]
. F- E8 _( `: t4 r* L% m0 w6 c//------CPUID Instruction Demo Program------------9 C: n4 w# A9 h
#include 9 `4 P: K# B! x
#include 3 l9 \/ G' P* L( ?
#pragma hdrstop
# u4 g( Q/ M( Y2 _' v7 `! |5 S//------------------------------------------------
. ]" s8 L0 D. c) i* P/ f#pragma inline
* m5 C; D( z; c* H) ~/ r! H* Y#pragma argsused% ^9 N) E" ^! |
int main(int argc, char **argv)
. f" F+ h5 ]4 o# W0 i" b{- _7 L7 ^, I: ?1 X/ w, j4 I
char OEMString[13];6 n" z/ y- D1 \: v' j3 f( ^' q5 _
int iEAXValue,iEBXValue,iECXValue,iEDXValue;4 g; x! R0 k) X7 G! S! e
_asm {; D) ~8 y0 r) ?8 r ~ u
mov eax,0' f& ?8 I3 F. c
cpuid/ a/ V' M) M# N5 r
mov DWORD PTR OEMString,ebx4 b: O* R) }+ \( e+ Y7 L( E
mov DWORD PTR OEMString+4,edx/ Y5 D9 Q- N* ]
mov DWORD PTR OEMString+8,ecx
. {- w& ?2 q/ z! Dmov BYTE PTR OEMString+12,0
& P# |' F! R7 H, v1 k' K- U}7 [) o% ^' d3 ~5 p7 P5 N( z* m
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
1 l1 x3 R( P) n+ D_asm {
- D: r% T& O9 y: \mov eax,17 [# o. `* ^7 ^; c
cpuid! g/ [" J6 P+ j5 Q
mov iEAXValue,eax
7 u& F! u; ^* i, c nmov iEBXValue,ebx z# b7 h9 E- C4 Q8 f2 |( B
mov iECXValue,ecx$ U0 L9 s) l+ P! i" t# J
mov iEDXValue,edx/ h( v' W" T* n2 c, }5 y
}
2 U, a; u( `9 L6 }3 Z4 M2 cif(iEDXValue&0x800000)
) ?+ x5 L3 [3 M) k- q2 Gcout < < "This is MMX CPU"< < endl;: Q H& }6 D9 m, ~6 K6 n1 ^. e
else: d+ A# U1 P k5 C' O! q
cout < < "None MMX Support."< < endl;
3 z# H8 C4 _+ L+ d: G( N5 lint iCPUFamily=(0xf00 & iEAXValue) > >8;
) e' `- C# I' [; c7 mcout < < "CPU Family is:"< < iCPUFamily< < endl;
% {" U( [% v7 _ S/ V_asm{
3 h( o* S' V6 g! K; d# p. [) amov eax,2* D0 @! |( S9 E# r8 }
CPUID
9 n( ]: w" Q: ]/ g6 H! F}
( i; { \+ b2 }- B/ ]if(_AL==1)- ?* g8 X2 l1 {) c! ^
cout < < " entium Pro or Pentium II Found";) ^, M3 L: S; x. Z# `
getch();
( B5 E) m( [1 Z: h6 P* Q4 Vreturn 0;
8 G/ W/ G" ^- T} |
|