|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:# ?- E8 e' [8 x* Y! R# y7 t
2 S) o* a7 c) M* FIntel 486 以上的CPU,
1 B3 ~. G5 \( j8 I) JCyrix M1 以上的CPU,+ Y2 N3 ?% Y2 n. t4 c
AMD Am486 以上的CPU
+ h' B% I; u) v. c- h5 [, \7 p0 h
3 a. A- k$ a3 Y- O: L (1) 取CPU OEM 字符串, 判断CPU 厂商 + Y( ^3 ]3 e# n# V: e
先让EAX=0, 再调用CPUID
; K9 E2 C: p; k% K" k Inel的CPU将返回:
/ |& W1 s2 T( D6 z7 W4 K& m! U7 k& G+ n
EBX:756E6547H 'Genu'
# D" l: r/ r1 E& j0 g' g2 eEDX:49656E69H 'ineI'
1 z8 ` M0 e$ hECX:6C65746EH 'ntel'
% z& }" P4 w& z; q$ F2 ^7 aEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
( F6 C; a8 Z% X6 }3 i1 g6 i
1 I5 Q& y" v) bCyrix 的CPU 将返回:8 n# Y0 w* o+ j* G) p/ [1 k) u5 |1 q. P
! I5 l a( C1 B8 R' j6 R
EBX:43797269H
3 q( ^9 P7 y* t( \EDX:78496E73H
& A' n1 z" X9 P; z+ r* `, rECX:74656164H2 X% K9 F' G1 g3 ?$ g
"CyrixInstead","Cyrix 来代替"。
! E( ?0 E. E. o M) |
+ }$ g& F+ P, @9 H% DAMD 的CPU 将返回:
" b' u( @: B7 F0 A7 D8 P7 D, y+ m+ R( D* P
EBX:41757468H
$ Z' J9 I( b; ?) ?$ x" AEDX:656E7469H4 b7 G/ j3 Y( |
ECX:63414D44H) J" P* i! N: }" v
"AuthenticAMD", 可信的AMD。. Z4 H4 G0 K: q0 W2 z" z
& s/ k- Z+ D* K5 A5 L4 y( b
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
! Y, L3 w% R q. b) k, K3 M+ p$ ~5 T( s1 E
(2)CPU 到底是几86, 是否支持MMX , P8 u, @. x V; V* ~/ e
先让EAX=1,再调用CPUID
6 B$ Z: L# O& ?7 F" ]6 O/ W EAX的8到11位就表明是几86
% ^8 c" j8 q8 _. g) e2 Z- [1 ]3 ]! G7 W/ C7 C1 y, O
3 - 386# o* h6 Y( ]; H$ @: I2 q) K4 a6 v
4 - i486
$ t1 ]( l" s7 r' o5 - Pentium. P- E& C7 ~$ Q1 M# W- v
6 - Pentium Pro Pentium II
" B3 d8 b; h7 U$ E) H( Y2 - Dual Processors
- s/ [& f8 ^' ^( t1 P: F, g, H! Y( T* m; m$ j8 z2 t
EDX 的第0位:有无FPU
) h4 Y+ Z5 P; R6 o2 P5 a4 L! f2 s3 F) M9 h' p) Q( d: T
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
4 t2 K+ S# n4 x9 r; w
! {; z6 {% d' i& r (3) 专门检测是否P6架构5 C. z9 z! d$ M% a, V( i
先让EAX=1,再调用CPUID
* b4 ~! F2 G, F2 V) C 如果AL=1,就是Pentium Pro 或Pentium II
2 A. \! n( }- q$ q/ C (4) 专门检测AMD的CPU信息
& W1 T& b9 w. U, X$ h { 先让EAX=80000001H,再调用CPUID
$ `+ q$ q: K4 I7 V2 Z 如果EAX=51H, 是AMD K5
; d9 O5 l4 ?- {1 B9 C& W0 e+ M 如 果EAX=66H, 是K6
1 o$ B% `( d& J6 \7 Z3 ^ EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
7 C* |0 k% V M% s# s0 r EDX 第23 位,CPU是否支持MMX, ( ~/ e1 Y3 X5 {* _2 q( v
& O, w* p7 Q _9 c3 X% g
程序如下:8 K# n8 D2 v" o0 X5 k
- h- t- O i& F# y! k) _
//------CPUID Instruction Demo Program------------* I F- |9 z" b6 y& f5 F4 }" b
#include 1 \5 [" e( t: _9 f- W3 l! b) v- J
#include
: a% p+ G: H: W, r* D#pragma hdrstop5 o2 X8 {. @( p# V6 Z# U$ T5 z4 @
//------------------------------------------------, o! [/ l2 U8 d: S
#pragma inline
: ]7 u" C2 d3 c# L* E. G" X+ A#pragma argsused
# p) b. i& J1 i( W2 B9 e' t" lint main(int argc, char **argv)
7 N$ e% d" W" V{
: d" H& `$ p4 X' l% D gchar OEMString[13];* v/ J& ]7 L8 R
int iEAXValue,iEBXValue,iECXValue,iEDXValue;+ Q# @ O( v4 N" Q6 i5 k
_asm { i3 F. n/ z8 r# o# i
mov eax,0
) Y: k, ]# c z% g+ r- Y; v/ lcpuid$ }3 P' ?9 G( v; B" v# _
mov DWORD PTR OEMString,ebx: b5 O2 O+ R) W6 e
mov DWORD PTR OEMString+4,edx' o3 g! p0 R3 ?3 {1 Y
mov DWORD PTR OEMString+8,ecx
- x3 _% j* K$ N e6 l1 hmov BYTE PTR OEMString+12,01 ~) [/ z/ n0 X( {3 R+ A, l) [
}4 S& m( E; b, @/ i T- g4 ~/ I
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;: [$ p: K6 ~2 h2 v# j$ ^. I. z
_asm {
! H" G+ |5 g Dmov eax,1
, p. o. m" p1 b, y) x. p4 u5 pcpuid- X8 P. d" f5 P% F- T) X
mov iEAXValue,eax
0 Y. q; E; o9 _mov iEBXValue,ebx
% }4 d" r, x+ I2 Omov iECXValue,ecx! }' Z/ r9 _; D7 u) E& N
mov iEDXValue,edx
/ {7 X: \9 U# {: s/ _* D! b}
t0 u' C( w7 O5 S5 r$ Z$ y; B& aif(iEDXValue&0x800000)% H$ ^7 r. t' r
cout < < "This is MMX CPU"< < endl;
. ?$ i8 T4 P: x8 melse
1 i, d/ k9 M% G( u" G! j/ scout < < "None MMX Support."< < endl;
; v% W. I! R7 v X5 Iint iCPUFamily=(0xf00 & iEAXValue) > >8;
* r) h3 z1 m( }8 l* U/ _# \3 \( p# Fcout < < "CPU Family is:"< < iCPUFamily< < endl;- L6 U0 P( m4 o, d
_asm{2 T) t& o* w: o
mov eax,2
, k D* ~: E- `$ YCPUID- c' X/ u0 q5 d/ K
}1 d" |, O$ b6 Q. P
if(_AL==1)
, ]& f, w) Y4 H% L5 Lcout < < " entium Pro or Pentium II Found";$ |$ O7 ~& }' j/ ~4 H8 V
getch();
! ~8 r6 a5 c& L5 c4 k# d" rreturn 0;
! ?( a- |" T$ e9 v1 x" C} |
|