|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:1 c* [1 S6 v, P: t8 J3 z+ t
; X, |: E! @5 u- D: JIntel 486 以上的CPU,' R% i) ?5 s3 l- W
Cyrix M1 以上的CPU,
# n( ]* I- K4 y0 x5 N. {5 h/ c' ~AMD Am486 以上的CPU' Y( w5 d O. `& E. l0 d, q
' a. V& ] d) H# j; r( O (1) 取CPU OEM 字符串, 判断CPU 厂商 $ c2 k! \* n% N% F* X
先让EAX=0, 再调用CPUID 7 a" q: F! V1 W* O% E, r0 Q. Q% q1 }) ?" p
Inel的CPU将返回: f8 L! J, U. a# s
' i& ?+ H) Z1 V, b I$ s8 QEBX:756E6547H 'Genu'
( {5 K6 ~% z, S, yEDX:49656E69H 'ineI'/ v5 u+ ?' j8 n2 I) i. k
ECX:6C65746EH 'ntel'
6 A' r/ y8 Y5 b2 nEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。8 g6 i! d+ f" p! d, [; g
5 N' J) x7 { p# l7 YCyrix 的CPU 将返回:
* _; q/ x* M2 F/ o8 x0 K5 C0 b5 `- w6 F ], w5 M7 j0 v a) K
EBX:43797269H+ |6 F8 D5 Q9 j1 ?% z6 Z5 {
EDX:78496E73H* F7 _6 h8 |: S
ECX:74656164H
) n0 x! l3 c6 @6 l& ]% b: E"CyrixInstead","Cyrix 来代替"。. ]6 }/ y' M& s G# H
7 L `+ g# C( t9 J, {AMD 的CPU 将返回:
- G/ P. L2 G4 g* V( Z
: ]( @. g9 l9 v6 q8 G& hEBX:41757468H- q+ ]. Y1 f7 L
EDX:656E7469H2 | T! t* _$ X7 B/ @
ECX:63414D44H
, ]- Z- z% s4 w"AuthenticAMD", 可信的AMD。
7 {. s% j' c# {8 A0 n: s7 ?- \* d2 I: I8 s% k T# _0 d
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
+ z6 l, {4 v8 J) P- X0 R; _" L' L4 K. N: P3 G# z0 M2 y+ N
(2)CPU 到底是几86, 是否支持MMX
: M; ~9 c: z) r4 V, B 先让EAX=1,再调用CPUID 9 Z+ a0 }5 W; K3 a+ U- i* M% x
EAX的8到11位就表明是几86
$ X2 Q3 s) z6 Z D R: ?; g' U5 O# ?# ~
3 - 386+ O0 b2 V- k3 e. W+ E
4 - i486& F4 h# Y Z2 a# c1 |0 }5 H& [
5 - Pentium
B# @- z; t% a( D) y; M6 - Pentium Pro Pentium II8 b1 s3 e, S7 a! ?* n" ~
2 - Dual Processors* I$ [, y# K% v
; ^+ \3 k! V/ Q, V! Y/ C! q6 g EDX 的第0位:有无FPU
% q3 \; [2 ?* S, A
, ]' a2 p4 M- M t. u EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
7 l0 N: E, e' S5 A$ I7 P# g) @3 [: z; f; Y
(3) 专门检测是否P6架构1 W; ]' W, u0 h
先让EAX=1,再调用CPUID / |" ~: Y2 L0 h5 u9 k
如果AL=1,就是Pentium Pro 或Pentium II
k( P& I* @3 O/ e (4) 专门检测AMD的CPU信息
' z' E! j/ e- `2 k- i# l- s9 c$ o 先让EAX=80000001H,再调用CPUID , C. z: r" b7 j: B6 T. g1 R
如果EAX=51H, 是AMD K5 ; m' [! ?! n! d W
如 果EAX=66H, 是K6
3 l7 J. J& i# ]$ W6 w3 b7 @+ v0 c EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) ( ~5 l- c- J+ D% Y. {* g$ a
EDX 第23 位,CPU是否支持MMX, 5 @. f/ y1 f J' _+ B7 w; c
( V) _$ N% z9 P5 @; i# U
程序如下:* c0 S: G8 w1 [9 u" y, c7 M& y/ s( ]- W
. e' I/ s, S" T x- P+ W3 T
//------CPUID Instruction Demo Program------------
9 S o& t/ P" ]#include $ f% u. T) i t( m# o) I8 w
#include $ p/ f. D, y( ^, s: Q1 a
#pragma hdrstop- L- ]7 R- g, j4 g2 }
//------------------------------------------------
( N( ~, ~1 e& p4 D1 Q#pragma inline
2 \( g( p) V5 [5 K$ F" q* y#pragma argsused1 M4 W: y" }1 w, F; K
int main(int argc, char **argv)7 b+ I( ]. }% w! n% K& t
{8 U6 Y1 w: B) p+ S- v6 }
char OEMString[13];% W( |6 Y' G: ^; Y% R! Z
int iEAXValue,iEBXValue,iECXValue,iEDXValue;& t( z) _7 E. Z! C$ R& o, j0 _
_asm {
- L. I% P" o# C& l5 bmov eax,0
i2 q7 n7 i( Ecpuid W$ E6 T4 m" ]: V: B U# ~
mov DWORD PTR OEMString,ebx4 b/ T4 u' J" [5 v2 }! W$ B
mov DWORD PTR OEMString+4,edx
( D8 M6 b) R& C+ H' }- f4 |mov DWORD PTR OEMString+8,ecx# W3 \5 ?1 C/ H4 D, L
mov BYTE PTR OEMString+12,0
% {: A0 _) s, w* E) ]! f' a* E6 H}- A+ L6 J* b4 ^) g$ G d
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;4 z, r( d1 M$ B; q6 |9 z
_asm {6 E+ c8 q7 n( s8 j, a0 B4 d, Z7 p
mov eax,17 j& A+ a1 ^ U- G
cpuid. ^! _# Q3 m5 ^. \- r- W w
mov iEAXValue,eax( X+ M# [: N: a7 m
mov iEBXValue,ebx. D7 V g6 m ^! a; Z" ?. r6 b [
mov iECXValue,ecx
6 I f) W% a0 r/ |mov iEDXValue,edx* V7 t0 s& Z% K0 s% E
}+ J- K. j4 [1 c' Z& v& Q& W
if(iEDXValue&0x800000) C+ h8 F& B& Q3 M4 H* x" {
cout < < "This is MMX CPU"< < endl;
, f6 _( ~- N6 C3 g% q4 s' ~5 e3 d9 Ielse
+ u" L7 M. r! \ W. g& {4 qcout < < "None MMX Support."< < endl;
# |' F6 D/ ~3 q/ B3 jint iCPUFamily=(0xf00 & iEAXValue) > >8;* ?. p4 c4 b& k d; X) ^7 D* |
cout < < "CPU Family is:"< < iCPUFamily< < endl;, X6 a) E. w+ ^6 g2 F2 j
_asm{
; M# E" H# {# k1 m+ A( Smov eax,23 ~! d3 U$ D. p6 t/ _
CPUID' ]+ ^7 y% v' U/ E$ P6 z
}
# e2 Q/ U! \0 G! F) N, Y3 p8 O$ mif(_AL==1)2 l* p$ K+ x1 D: G4 m N* O' @2 ^+ u
cout < < " entium Pro or Pentium II Found";; s1 P: B' x5 h
getch();
9 b7 i+ E6 i, I" C5 G& `1 g+ Lreturn 0;* Q* \" f: Z N1 i5 F
} |
|