|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:/ ~* g0 A) |7 X2 b
% g( I; A- O2 u7 Q/ ]1 q+ `Intel 486 以上的CPU,
$ t; ]! w( |# C2 S2 JCyrix M1 以上的CPU,
0 b- d% X# P4 _( Z9 DAMD Am486 以上的CPU
% Y1 v4 ], }2 p" E) t: A* {4 Z1 O& T9 E2 P- g4 v& [; D+ ?2 R" T
(1) 取CPU OEM 字符串, 判断CPU 厂商
- q0 _4 K2 Y ` 先让EAX=0, 再调用CPUID ( N6 a0 Q( g( l% `, ~4 l
Inel的CPU将返回: + i/ P+ [) y9 b
# K% v& G, j3 g, Q, ?
EBX:756E6547H 'Genu'3 }. H$ U9 U* G+ O9 I& W) ~
EDX:49656E69H 'ineI'4 m3 x% b' w7 H8 r, U3 ^! e
ECX:6C65746EH 'ntel'0 ?% d( g- S) h! ~
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
* |0 N$ ^* U: \5 i2 }& j }" Q6 p6 {8 P9 o. p3 I' O W
Cyrix 的CPU 将返回:
- s! l: d/ a" [- H6 B
5 R: ]6 {5 B' b& N6 k' {/ z+ OEBX:43797269H( w$ z: B( p5 j* {$ i( J
EDX:78496E73H
3 e2 f+ t& M- G1 FECX:74656164H3 y9 T2 Y9 W0 b. {/ t# r5 s; ^" N" B- r
"CyrixInstead","Cyrix 来代替"。
# Y9 O# i% E3 f
; D$ U- v7 T3 R' Q. v- u! j5 C6 bAMD 的CPU 将返回:% W4 a. M0 W. h6 R$ c, S* x; ~
( q' m8 F/ s# S# F$ N) @ M
EBX:41757468H* U* y$ Q! z; d: H
EDX:656E7469H& p) o! ^: X& f9 K: l
ECX:63414D44H5 [0 o" K8 B% {+ f; l/ ~
"AuthenticAMD", 可信的AMD。) G0 N! W! |* h- i7 d1 n- ?
7 x# h" S, L" y7 G/ J& I0 ] 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。/ b! V$ b$ H' c9 \. t/ f
$ m* t: j8 l' R- X- d (2)CPU 到底是几86, 是否支持MMX ( f1 s/ j8 o# M; `+ n5 c
先让EAX=1,再调用CPUID
8 U: R9 p1 E/ p7 `/ ]; P EAX的8到11位就表明是几86
b/ W8 [9 P9 v9 `' B2 j% I3 d4 b; n+ [+ o" e2 F: I
3 - 386
+ w) }4 @4 l; s4 - i486
! R% L& o: a3 p) E4 R5 - Pentium
9 _+ n' L9 t! v% x2 k2 O( D6 - Pentium Pro Pentium II8 O0 G$ v' x' s( B
2 - Dual Processors& A+ a% a8 @$ i: s1 o5 p& T
0 \: \# J6 J" @3 A9 J
EDX 的第0位:有无FPU5 S0 {" p. z! p! R. y- P9 a# }
2 M* a: _1 L' A& o# }
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 / \2 e8 K0 q: q0 {1 l7 X8 H
5 j; f0 j5 Z1 k: A (3) 专门检测是否P6架构
; u$ |. O8 k9 N! P 先让EAX=1,再调用CPUID
. g$ R6 p" G0 d8 Z 如果AL=1,就是Pentium Pro 或Pentium II
0 }) ]& ?9 o4 M8 N* X9 { (4) 专门检测AMD的CPU信息 3 n" N' S" M0 P6 `. L4 K9 v% P
先让EAX=80000001H,再调用CPUID ) m$ ]* G& L! _; S
如果EAX=51H, 是AMD K5 " H( [; o; }( ^7 c! l
如 果EAX=66H, 是K6
. k' `% F; C; E: v( o+ k EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
5 v& t9 n5 z) @, F3 w EDX 第23 位,CPU是否支持MMX, ! h; ]% r9 D' i0 ?6 z
8 q' ?7 d) Z7 s# ?, ~ 程序如下:
: e& K' t3 V$ z( r& ]: n+ j
: `$ }' h/ a y1 \( A//------CPUID Instruction Demo Program------------. v5 q: G6 H( V7 y& |
#include
+ [/ X* |: I) q) @1 t# T3 [# i' B#include
" e) H& u# R$ h4 @' d#pragma hdrstop* f# c% S8 J" B' h# D
//------------------------------------------------
% W& N3 ?# z5 T/ I( ^0 b& x+ H#pragma inline
% p5 Q- O( B' I2 t$ v#pragma argsused
/ Y2 R! j9 K& _4 T; Y5 Mint main(int argc, char **argv). G) ^$ K3 ~ K* ?7 Q+ R
{
6 [2 ]3 A$ d4 N" x& o! @char OEMString[13];8 x2 T; h; U. G. A" a# E
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
% ^4 m$ ~ }7 M5 {) w9 s6 h( n2 l_asm {
% Q" m$ K# t, v. j% [mov eax,0
$ j t/ x8 x9 z5 V& L z4 dcpuid* K: A, X+ o7 O% D$ H
mov DWORD PTR OEMString,ebx
1 e, l' m- _ y2 u, wmov DWORD PTR OEMString+4,edx
/ b" g# F2 K( y0 wmov DWORD PTR OEMString+8,ecx
* c2 x1 ^6 O- A! g8 s- S: @, K3 k$ wmov BYTE PTR OEMString+12,0* U* b% j. R1 j% }' r
}* _+ g6 j4 n% v2 K) S- \
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;# g5 }# }/ L+ k: K
_asm {
$ @/ t% D( D: w, }) Q/ S4 _mov eax,1
) m" o$ q' J& H: e; J+ tcpuid
" J, t9 M. i+ [mov iEAXValue,eax
! Q- n" u; m5 X; A, X* nmov iEBXValue,ebx
7 ^+ N% G' K9 [4 S* vmov iECXValue,ecx: x/ l4 X @5 h! ~3 w
mov iEDXValue,edx; r* W! q) o+ r4 ~0 s
}
8 j( d9 x( k. q- Xif(iEDXValue&0x800000)1 ?8 z+ Q3 I. s* T: g
cout < < "This is MMX CPU"< < endl;
/ _! P& R7 i: Y, o' p7 i4 F2 l, Melse
( F, M/ k# k4 x& Gcout < < "None MMX Support."< < endl;
! Q7 Z4 V) O% l' E6 `int iCPUFamily=(0xf00 & iEAXValue) > >8;
, \$ L7 F$ ]8 u% d! Qcout < < "CPU Family is:"< < iCPUFamily< < endl;/ o% {+ F' n8 m; R- o1 m) h& l
_asm{3 E6 o3 S( S0 U6 e' p: u9 N
mov eax,2- w6 y. ?( a4 p4 K; e/ E
CPUID
' b: q' X! u/ R8 Q- R3 R% C$ T; Z7 D}/ \3 j+ B) w- S
if(_AL==1) p) u* a# c. F; t F" z. V
cout < < " entium Pro or Pentium II Found";
. _6 g, n9 A2 y7 v$ y# g3 Y6 xgetch(); b; |. {5 q, G1 S2 R" E$ V# M
return 0;
4 ]% S( p v Q6 @! s} |
|