|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:5 ^6 Y* h* n: T% \% D
7 t& g5 [+ y1 l9 ^' m4 vIntel 486 以上的CPU,) \; ?. y! M9 y6 `7 \2 a4 A% \
Cyrix M1 以上的CPU,% Y9 d3 g+ z) j. X' c4 N) b
AMD Am486 以上的CPU, B- F' T# |7 Y; ~$ T( U
' ^9 ?9 o$ i, m" D
(1) 取CPU OEM 字符串, 判断CPU 厂商 $ x. v! P% ]& A1 u
先让EAX=0, 再调用CPUID ! b0 u4 C/ b; S0 l
Inel的CPU将返回: $ u& q" c* E2 H0 j2 ?7 ?: D
/ I( u q% C- G0 zEBX:756E6547H 'Genu'
4 C: h5 t7 x( w6 T# _/ ^EDX:49656E69H 'ineI'
$ u5 }3 p; p; B( mECX:6C65746EH 'ntel'& j! {- l. H. x7 g5 Y. b. `% L
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
0 V3 c* l4 H! v* e( o4 L2 \! W- t7 R3 z2 @; [8 {
Cyrix 的CPU 将返回:" _* w/ ~' W7 U/ k) c9 @9 U
$ w2 ~+ y; Z. M
EBX:43797269H& Y7 K) p# T+ k3 b/ z u
EDX:78496E73H5 x z- s/ j7 Q' d0 l* v# ]5 K
ECX:74656164H
2 \5 `4 d0 x) m7 g& s% O' f"CyrixInstead","Cyrix 来代替"。
! _ F! t, U! c$ j; c! y) C) E
3 C- a5 b6 A5 I, j% ^" jAMD 的CPU 将返回:2 M( \: Y- U- _
) r3 v; ~# H4 F" K; Z
EBX:41757468H
! U7 K% ^4 y/ Y) Q7 A4 gEDX:656E7469H
4 Z, [: U( ~# u% R# yECX:63414D44H$ V" e, ?: P5 y6 n' w3 s9 r
"AuthenticAMD", 可信的AMD。" b' g% F$ ]0 G% l, b+ R
" X6 Z5 B7 d- g9 R
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
9 ]2 _8 f6 @8 b# H" b& r
6 R$ S& o2 \2 j7 O2 ] (2)CPU 到底是几86, 是否支持MMX 4 v$ ?% E( I* n$ C! ^; ?0 T: K
先让EAX=1,再调用CPUID ; Q. {9 ?* S L! N' x
EAX的8到11位就表明是几86 ) Z) V- b9 F1 N( f
6 r6 [- l3 E. \! r* ]9 N
3 - 386. _8 j) m" v4 W# F' S
4 - i486
6 l; L0 ?3 [$ ]( S" P: O5 - Pentium0 s4 z* }. J8 o1 n: n: k
6 - Pentium Pro Pentium II0 W& t' s& ]1 e a. [' @6 \
2 - Dual Processors* K6 [2 M4 n! Q) o; K8 Q
# k) q* E/ |9 T) C# |, E M
EDX 的第0位:有无FPU+ W) P9 }4 t6 R1 A, x1 \9 G
3 Q" {, ^* d i' G
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
4 @5 A7 T k. N5 o; X0 z R/ o% l. M3 a3 h& w) V% U2 A( s; d
(3) 专门检测是否P6架构) V8 O$ \; M( {
先让EAX=1,再调用CPUID
4 a% |5 m- b, r) {+ {1 F1 p7 u- O 如果AL=1,就是Pentium Pro 或Pentium II
0 k2 n' u) C. Y& y5 _* c% F7 Y- t (4) 专门检测AMD的CPU信息 * \, h+ ]6 p; @# X
先让EAX=80000001H,再调用CPUID 2 o) ^6 J% h5 x( J- A
如果EAX=51H, 是AMD K5 ! J: h! Z- E9 b3 C
如 果EAX=66H, 是K6 " N) _7 u% W5 s8 S
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 1 g4 u+ M! `/ N6 n# }
EDX 第23 位,CPU是否支持MMX, 4 o/ P/ j2 c2 x8 H1 g4 U% I
' t# S% s% \, `/ \- P
程序如下:( Q( o5 z! h4 u/ g
3 g% ~. n- x/ n//------CPUID Instruction Demo Program------------
' m- @, u2 h. v0 c/ d. L#include
! k- M$ W8 M" M; _. ^. ~#include
5 |$ O" v8 J& G% S% ~* m( r+ B#pragma hdrstop
5 J$ D c2 f. U6 s' _# H" B//------------------------------------------------5 k% ?6 e& l: g+ v$ Z& x9 |
#pragma inline( `' c9 ]6 E- ~7 w, \
#pragma argsused5 d6 M! _8 b" o
int main(int argc, char **argv)9 ^2 ^. M" I: H4 ]6 u& @1 q2 g3 C
{
& {% Y$ \ r5 ~6 hchar OEMString[13];
6 F9 n/ N9 t$ P1 ^) r" k- tint iEAXValue,iEBXValue,iECXValue,iEDXValue;) a/ u0 ]3 k; I0 e1 s
_asm {
: ^1 f0 K% }1 w. Z) }8 l7 F( Nmov eax,0* ^ \2 L T6 u1 z- [0 r* S
cpuid
& D- ]0 c! a8 {3 L. w: x+ Nmov DWORD PTR OEMString,ebx
; A0 l+ Z' w3 l; y- I1 `mov DWORD PTR OEMString+4,edx
' e M! ^! y1 f P: s8 d% Z1 umov DWORD PTR OEMString+8,ecx
r) n, p( |, tmov BYTE PTR OEMString+12,0
: `0 v m0 J/ W3 w* H6 k* L2 ^}
3 r1 K9 Q2 c# V2 Q# m4 Ecout< < "This CPU 's OEM String is:"< < OEMString< < endl;
7 k$ z3 d) j; e$ I_asm {
* j* W6 f A& v7 }3 h5 t, qmov eax,11 g. N+ u8 {) _
cpuid' J, K, Y# W; W! M7 t" F6 @
mov iEAXValue,eax
/ j$ q' a0 I \/ @% {6 _7 qmov iEBXValue,ebx1 \# K1 a( L' \: o% `! `+ M, B
mov iECXValue,ecx
. a y* c/ m: a1 @/ I, m+ w, Bmov iEDXValue,edx
7 T+ {; G; ~. B N [}0 b. l8 w1 ]& x( w, N
if(iEDXValue&0x800000)
+ @ `3 b2 f+ Y2 Ocout < < "This is MMX CPU"< < endl;
) R2 H* F# b- f) C8 v, aelse
3 R7 ^( t- s2 A1 l2 }cout < < "None MMX Support."< < endl;/ @! X6 A/ `( Z, q4 ]
int iCPUFamily=(0xf00 & iEAXValue) > >8;
* P5 o- \( i4 g! r1 @% M I! zcout < < "CPU Family is:"< < iCPUFamily< < endl;+ r1 C: b( O1 W# a! n
_asm{
5 D# ^& P, [9 W+ }, Omov eax,2. E) V2 L' i. \7 ^
CPUID
! @! _; Z+ s ]! `7 |7 N) L}
5 [5 O3 [2 z4 e1 h5 l( R' tif(_AL==1)6 A$ E9 X6 d& X5 {3 _
cout < < " entium Pro or Pentium II Found";
: m2 {) V2 J6 r' j+ qgetch();
- p" f# e' w5 B) J4 Q. }1 Rreturn 0;
: k+ M2 ]1 t# e} |
|