|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
7 W7 K4 r$ a8 f Y" L, \ v) l. Y5 U7 e/ Z
Intel 486 以上的CPU,
6 R0 E* R3 [5 t9 S( M7 g" T1 ZCyrix M1 以上的CPU,4 I% E2 ~# j' P; q8 e# g- o
AMD Am486 以上的CPU
h+ B. X. l! ?2 f2 c6 j
7 m* s2 w* L, v2 S; T (1) 取CPU OEM 字符串, 判断CPU 厂商
* R$ B! ?" B2 s# e8 [" V$ Z+ n 先让EAX=0, 再调用CPUID
% u2 F7 K: C, t e Inel的CPU将返回:
. u; P- j+ [6 ` r5 B, |6 r+ \" T6 g# V2 V
EBX:756E6547H 'Genu'
/ _% `9 C' D+ _ H8 F( A3 NEDX:49656E69H 'ineI'. h* ]! y# [. C, \, w! B
ECX:6C65746EH 'ntel'
; j2 h% B7 j Q% LEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
) B, v6 K8 t' a% y# g0 Q! Z# j5 Y: w! _5 \# ?
Cyrix 的CPU 将返回:
2 q% A! K/ x. v5 O2 w T2 ~0 \0 _8 C1 Q- p7 a) J
EBX:43797269H6 k' U( _4 e/ z$ ~" d" W, \
EDX:78496E73H3 `6 F! P, [. v) r# T5 b4 p Q0 s
ECX:74656164H( z/ W( n1 K5 a) T3 H" k7 \
"CyrixInstead","Cyrix 来代替"。! }$ d( D+ v( @* k) T. y
+ h+ ]1 W" q9 ?0 c6 w. ^1 ^
AMD 的CPU 将返回:
8 H) ?2 [# U6 m! z; O/ D* j% q' u! Y9 l1 u
EBX:41757468H3 s# [7 R7 @2 `" P9 u p
EDX:656E7469H9 c; ^8 k8 S$ K6 A1 E( @
ECX:63414D44H9 Q$ a8 M2 J' C0 p" v& f- q# O) x
"AuthenticAMD", 可信的AMD。3 X" l9 K, A! Z# ?0 s1 b
1 G$ _8 `. o* `& h( W4 n
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
. I; Y) J! x; ^2 Q* x7 \6 v8 g4 o/ F; I, P8 b7 A. I$ M- F
(2)CPU 到底是几86, 是否支持MMX $ ?% u' q5 j# o
先让EAX=1,再调用CPUID
: a8 T }6 b) _$ g3 D EAX的8到11位就表明是几86 ! q" R( p" u$ ^* s) j e
9 l6 E* p: ?4 L2 ^4 O3 - 386
F c! [# R1 W4 - i4868 }. V9 r: E b; o- l
5 - Pentium3 R; Q& O$ `1 w; D5 m/ K: R
6 - Pentium Pro Pentium II
" r n$ j% J$ ~* i2 - Dual Processors5 D. w6 ?0 w; s
# |% z' t- }" L6 t$ a EDX 的第0位:有无FPU; \0 r% r% w3 |) b3 R9 [! Q
9 u5 |. u& ]7 A5 K0 I0 V& O" V
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 ' P5 A: J& n# q* A6 N8 F& |
6 O4 C% G" ?% t" {
(3) 专门检测是否P6架构# E! _! V! G) r, Y$ N
先让EAX=1,再调用CPUID + n$ ^& I7 U% q; u9 b
如果AL=1,就是Pentium Pro 或Pentium II
* I# ]( L5 l9 ]7 [, K (4) 专门检测AMD的CPU信息
6 ~( o; @7 t3 G* W' H3 B 先让EAX=80000001H,再调用CPUID 9 ?0 Z7 ~6 b1 B g, _
如果EAX=51H, 是AMD K5 ! ~5 B* i) c8 y- X1 r/ ]1 p
如 果EAX=66H, 是K6 ' W' D, S9 E/ }3 A, k4 `/ O' n# n4 \
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 7 d/ f. H8 @6 O7 m2 o. c
EDX 第23 位,CPU是否支持MMX,
) m6 Y L* O, A8 ]8 Q5 o( `
3 l5 o; j5 I5 U2 O1 C4 F 程序如下:" k2 T6 U7 }0 o5 [2 \. L: n, ~
1 v) d7 Q+ \1 ]4 w//------CPUID Instruction Demo Program------------! c5 z4 l1 @# q* j( s4 w0 y0 p
#include
; `- J. n- _' |) R#include
+ ~4 I! g7 f4 \: O#pragma hdrstop h" ~4 W4 L: {3 L* g+ i, ^3 Q
//------------------------------------------------( A. n2 D8 `2 D, q* O7 [
#pragma inline
2 @; Q5 `6 D7 h% U" g9 f8 Z3 R$ K#pragma argsused7 i. z m1 A% g5 q' m
int main(int argc, char **argv)
* t4 j, v- Y/ P Y{% \ B9 H* e5 @6 Z1 H- o# K0 p
char OEMString[13];, ?6 W, N) L* M; _% T5 i5 A9 @
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
8 b6 V) D% [( O_asm {
0 H3 x" T8 J) `0 V7 {/ I0 x: g/ Amov eax,0- A& F0 W! x$ K
cpuid
8 q$ k3 x) @ m2 s$ ^& Amov DWORD PTR OEMString,ebx
: U) B: { f9 N" @8 f' omov DWORD PTR OEMString+4,edx. Z: e7 V* E* o* J) g
mov DWORD PTR OEMString+8,ecx$ q$ _, u: |" Q: E" o4 @7 I* u
mov BYTE PTR OEMString+12,0
* x. X( K( X3 l3 }; \6 D}
. V( J. P9 I" o" V, d, }; r, }cout< < "This CPU 's OEM String is:"< < OEMString< < endl;3 }9 \/ G, c+ ~$ ]3 ?/ E# a& C
_asm {( R) e8 S5 i4 o3 T+ t" j! J2 n
mov eax,1! }8 z. E' r9 O5 k+ }) N [
cpuid
! o2 H. s3 S; D+ Q& [5 @mov iEAXValue,eax
$ W* v i/ o3 u. s+ m( K4 Vmov iEBXValue,ebx6 ^2 w9 ]5 D+ e+ ?$ _5 v& i- w
mov iECXValue,ecx
' { b4 s% U& a' \8 \1 F' m; Dmov iEDXValue,edx
6 e7 t' \& n; F& O0 W |}1 H/ A7 u' x3 b
if(iEDXValue&0x800000)
$ r; c9 S% K" d* _+ W* d# V0 A9 Hcout < < "This is MMX CPU"< < endl;+ b' u. O, w$ A
else" M$ x, w6 H" t4 k' k
cout < < "None MMX Support."< < endl;
' H+ `( E' k) R1 }int iCPUFamily=(0xf00 & iEAXValue) > >8;
5 X' W0 x# G/ {! @% N3 pcout < < "CPU Family is:"< < iCPUFamily< < endl;( ?- o; }& c) }+ F( y
_asm{5 b0 S: t5 U% Z! n, k
mov eax,28 K/ e8 W5 U; \9 m% c; f2 F& l
CPUID7 {1 M1 ]" j d! r, c
}
$ z( B/ x$ c3 U' r2 Zif(_AL==1)% V6 K" {6 e2 K. @& U0 t
cout < < " entium Pro or Pentium II Found";( o& u. x4 T L) c2 P
getch();) y3 X8 s! r4 w
return 0;
0 Z% ~) n, p3 o} |
|