|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:) K, X, G' `3 J6 |
8 l! h; y/ c6 L5 j7 p) `2 KIntel 486 以上的CPU,
3 J! p3 k5 p& ~8 z( `Cyrix M1 以上的CPU," i9 a; p- C7 z1 g
AMD Am486 以上的CPU
; a" ^& m8 I! m$ a: O% r. Y! a. C; o6 Z) L3 O% I: g- a8 D- {
(1) 取CPU OEM 字符串, 判断CPU 厂商
# @3 E' P z, n( S 先让EAX=0, 再调用CPUID ) m! y5 d( ?: X$ r* b+ \+ c$ W6 f
Inel的CPU将返回:
8 D T% J! C* z% L5 G) Q' N3 _5 i9 W( W5 P$ K/ Z4 b) Q
EBX:756E6547H 'Genu'1 F- o* B' x$ W! v) ^& n& J* j
EDX:49656E69H 'ineI'5 ~+ |. a! `1 {9 I; |+ o6 Z4 M2 `9 B
ECX:6C65746EH 'ntel'/ U# i" x+ M* }/ r, G! h0 |
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
6 s% F: u% y" j8 I, ~ q3 g H( Y( J' y$ F; p& q
Cyrix 的CPU 将返回:# R! N: n% G; u! U# q/ V4 O
3 {8 z8 q& a' T+ `; l0 NEBX:43797269H
- x8 O) ^: {0 n1 _# K! eEDX:78496E73H; @4 Q' T3 b" d
ECX:74656164H3 G4 {; [+ u; s8 n
"CyrixInstead","Cyrix 来代替"。+ { P( x/ ]4 e0 A0 k+ l
! v" s2 g& K3 n% ]6 h! d2 kAMD 的CPU 将返回:
5 \- `( A, q$ E: i# @5 q0 Q! I Q4 m* _& z3 w' z. n- u' k+ |
EBX:41757468H- U5 | R" N( s ]$ ?! C4 q
EDX:656E7469H* H4 \' J& f. {5 q4 I/ A" U: x8 q8 b
ECX:63414D44H
4 M. H7 Q, A x4 o"AuthenticAMD", 可信的AMD。 {" v8 ]& M2 H/ G: ]6 I& o
+ W- |2 B- D3 _1 ~9 @' H 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
1 O$ q7 k# P/ @3 D! @6 `, M1 d; F0 w0 A8 ]4 `
(2)CPU 到底是几86, 是否支持MMX - O) ?! l9 U; A* n# _
先让EAX=1,再调用CPUID ! l6 u2 G4 J7 n3 D5 ^2 ~
EAX的8到11位就表明是几86 6 Q2 }* M% m) P
' Q8 y$ F/ }/ @; G
3 - 3865 ^- ]: S. F6 x& ^$ Q9 O
4 - i486
) l+ v* e E# t) h& X7 o5 - Pentium
) v; M: ~6 s" w3 p6 U6 P6 - Pentium Pro Pentium II1 a. s) B# E( W/ X7 ^+ p$ l* p% U
2 - Dual Processors. w" q! i7 ?! v
4 z7 [, u) V* @ g( ? EDX 的第0位:有无FPU
7 ]/ \! q" y- u$ ~+ K/ d5 {/ n9 D9 \' X# p! m: s% @; A/ P
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
6 K9 @0 I2 c0 `' D: @
* K/ c8 Y. x, b. I, U (3) 专门检测是否P6架构
# L( L. J; {! X* Q) t- R 先让EAX=1,再调用CPUID
' D8 { U9 q% M- T) n 如果AL=1,就是Pentium Pro 或Pentium II - b5 {0 A' }& ^/ P0 t
(4) 专门检测AMD的CPU信息 2 X) ?7 n3 q, C3 w [
先让EAX=80000001H,再调用CPUID
5 H: H7 e3 s M$ }% j 如果EAX=51H, 是AMD K5
2 U I# ^# U- j4 H) } 如 果EAX=66H, 是K6 ; g/ [. F, S' x; R6 p2 \/ v* b9 f
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) % Z7 v5 f: @4 Z/ p4 B9 S F2 u
EDX 第23 位,CPU是否支持MMX,
8 a- Y/ {, H0 T" O, V9 T# h+ [+ {1 x/ s3 i5 {$ T( G3 S
程序如下:" |( @9 T. ^/ ^6 b+ f$ N2 T+ }
5 h3 X F( a/ C. D' Y) m//------CPUID Instruction Demo Program------------
% x8 K+ L o: c#include
`$ C% P, m/ l- R- o; W#include
7 }1 |. i# S6 b2 j. i9 H#pragma hdrstop
1 _; {8 @0 B6 A- ]//------------------------------------------------) W0 H) G" \% @% r, N8 o4 V
#pragma inline( j& h9 B2 C( G. J1 E8 R
#pragma argsused
* G0 d& G8 W% f% Yint main(int argc, char **argv)
& j% D: |" K Y# ^. C{
, {4 V$ H' |4 z! P0 e$ h7 Schar OEMString[13];
" i/ {' X: Z1 e$ h$ Cint iEAXValue,iEBXValue,iECXValue,iEDXValue;
8 R, U6 z: X) D7 g* B! h_asm {0 G8 K2 G6 n5 L" r) |
mov eax,0
' G. B! N3 }7 G7 }* Mcpuid3 Y# `1 k9 x; f: h' |: p4 Y5 b
mov DWORD PTR OEMString,ebx
3 ^$ X$ V# W( O5 [2 umov DWORD PTR OEMString+4,edx: c) p. U0 L" W) o- u. {2 }
mov DWORD PTR OEMString+8,ecx
6 i) A0 U" B8 u; }mov BYTE PTR OEMString+12,0( N) ~- F5 D! \5 X1 ~, B- `
}
9 ?: l5 f9 c4 ], d) p6 ncout< < "This CPU 's OEM String is:"< < OEMString< < endl;0 ]0 g, P& [$ @+ c3 U* g0 p; N
_asm {
6 C7 G, S0 x0 v4 M( [+ cmov eax,1
* ^8 W7 L0 y5 T" l# wcpuid. V+ Z6 j9 @& N g& S0 K1 @
mov iEAXValue,eax V+ S$ q' a, D" u) v5 n
mov iEBXValue,ebx$ k, X5 q+ @; `4 e8 _* [" O3 L2 Q
mov iECXValue,ecx
& b7 q4 G) G4 Cmov iEDXValue,edx8 _' p* J) K) j, [6 K7 B( Y' j$ ~& d
} s1 M# B) T/ d; U
if(iEDXValue&0x800000)! V. D/ y5 B; F d4 t
cout < < "This is MMX CPU"< < endl;3 v( z$ A( \* @1 d
else
1 V! G) y! V& K& x9 `) gcout < < "None MMX Support."< < endl;
/ O9 ]& W5 \* A% k. U8 M' I, s7 _int iCPUFamily=(0xf00 & iEAXValue) > >8;
; K' m. O. _8 g$ v/ n" {* L9 pcout < < "CPU Family is:"< < iCPUFamily< < endl;
; q. U* _5 T* B+ @6 O1 @_asm{5 N8 C& f: q( l, g
mov eax,2& k6 X8 k: K) g! n2 }, D( n @$ z
CPUID
5 `( u' H! |; H1 C}
$ I7 Y, j( Z% z! M( N$ Q9 kif(_AL==1)
. ?- L6 a# o. v @# @! Lcout < < " entium Pro or Pentium II Found";4 H4 f) `3 A0 R# F) L6 w
getch();
* `( `# `9 R* ?, s$ ?: K: ]return 0;
* n+ m3 T; b% {- a} |
|