|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:7 B+ u+ U, ` f% _8 z- n
- B) o3 M# t oIntel 486 以上的CPU,8 \ C8 P3 N* V3 `9 P
Cyrix M1 以上的CPU,
5 O& t* m* L0 J: q4 Q7 N$ z- }- n& z5 VAMD Am486 以上的CPU4 T! W* B" ~! {8 i8 r
+ {" j1 {& f9 S2 d: U (1) 取CPU OEM 字符串, 判断CPU 厂商
& p! e# [; e D6 h4 B 先让EAX=0, 再调用CPUID 8 z1 H/ C! L! o* B3 v" W; j
Inel的CPU将返回: 6 h* x2 F1 Y' k* Z/ @( r
) G' [+ z: J8 g- s# I- S
EBX:756E6547H 'Genu', X( |3 m, j8 D2 j8 W6 O
EDX:49656E69H 'ineI', G& b1 f, A0 r' N. I
ECX:6C65746EH 'ntel'
9 @ Q: t; f6 U, j1 u5 @( zEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。9 g7 \% \8 u: U- i, G
i+ a) C5 R' L* o* a8 n; R: uCyrix 的CPU 将返回:
) B' W: d3 T; j) f: K* g
6 \) {0 ^, N* j/ n9 d+ Z! P( ?EBX:43797269H
+ B, P5 P9 x% v" [% v+ [( e1 R& gEDX:78496E73H
# _6 f/ I: \4 G- G7 n ?5 j" aECX:74656164H
1 |, c4 X; y; M. ^) j"CyrixInstead","Cyrix 来代替"。
1 @2 ` |4 h3 Z0 ?8 @; _& Q9 ~, X6 e E/ [: R
AMD 的CPU 将返回:
6 C5 S2 O W7 i8 @3 p2 ?8 V) p& |! F
EBX:41757468H
1 B- h' m! q" _* IEDX:656E7469H
8 w0 h! ?8 L: y( b: g, HECX:63414D44H6 V l$ i3 G/ \0 o4 l
"AuthenticAMD", 可信的AMD。
* h& S4 C2 l* A0 s$ j' w- H! l3 l1 B! H9 [- n. {) T
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
; X) }0 k/ H9 Q2 }. v8 e; g3 Z* }
0 O! x' Z" z) I (2)CPU 到底是几86, 是否支持MMX : H9 \; j: l3 W+ h1 [
先让EAX=1,再调用CPUID # n& l% ?6 M5 g0 J; P% e
EAX的8到11位就表明是几86
! ~$ I' m- c- U. a! U* ]8 _1 O8 F+ ~
7 {1 U: M, ]4 s: Z0 P3 V }3 - 386
: g0 s2 r+ y+ u# w, K4 - i486# ?: c: N( E7 h+ j
5 - Pentium' o6 [) ~3 Q8 j$ J; L
6 - Pentium Pro Pentium II
) H0 a! v3 ~- y5 @ z1 k" z2 - Dual Processors# x3 x5 {! A+ t9 `1 R9 C6 \7 k
0 y8 M, o: a8 \ F; g7 K# q) V% K EDX 的第0位:有无FPU/ f& m/ E5 w2 ^+ d; A) ~
% d' C( h( A5 c: Q$ @2 S' u
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
5 _" l J$ b) ]( l! `; t3 R9 }: B$ v4 ~( U" Z0 ^
(3) 专门检测是否P6架构 ]8 _: l/ z0 b
先让EAX=1,再调用CPUID
) a3 q2 o; m3 J! ]2 C9 d 如果AL=1,就是Pentium Pro 或Pentium II
# s" a$ ?( B' X) N: ` (4) 专门检测AMD的CPU信息
O. p/ d; A+ J1 D3 ~" p& N 先让EAX=80000001H,再调用CPUID 0 @3 F d; j# z# K
如果EAX=51H, 是AMD K5 ; f8 m9 ]0 E/ c! y
如 果EAX=66H, 是K6
! ^: i, z/ z5 b EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
! l& _; O/ Q$ v( J EDX 第23 位,CPU是否支持MMX,
7 k" ^ P7 A% n5 N; C) A# P N2 T+ i4 [8 P7 u5 ^
程序如下:: @: d+ G& V* N! G1 C' |/ D0 N( L
: c6 R) f# j' @, p0 L//------CPUID Instruction Demo Program------------' _; }! A" u7 R3 B1 q/ C" f: X
#include
& U7 E1 Z4 K" a3 G* w% j& P! Y2 w( @#include 4 s' m& E+ Z: |& Z6 g1 @
#pragma hdrstop
" v. P; e' a3 Q8 ?- j6 K5 e- E//------------------------------------------------. h7 F- i8 o5 I5 N8 X
#pragma inline) o: n& u+ M8 p9 @; j G
#pragma argsused ~9 V. c6 R0 n
int main(int argc, char **argv)
$ g! F' W7 S# @0 @' P1 P{
8 `8 a" g9 Y0 ^1 N9 cchar OEMString[13];
/ f" o$ p6 Z- ?: A% yint iEAXValue,iEBXValue,iECXValue,iEDXValue;
3 t. B- Z& G+ o3 D_asm {- E. `4 x( X( Z4 T) V# A! D
mov eax,0% L7 e# o! m, q8 z
cpuid
# |' w6 E/ o$ R! emov DWORD PTR OEMString,ebx
$ C# F- c5 q: T7 B: o# w9 `mov DWORD PTR OEMString+4,edx. Q' [# A) }/ ?
mov DWORD PTR OEMString+8,ecx
+ x. M2 n t5 s& A( ymov BYTE PTR OEMString+12,08 }5 ~1 R9 ^' t# y
}2 t& _" K4 N* i
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
* d7 N3 ~8 [9 x4 k I$ Y# P) L_asm {
9 I; E* E; |7 g8 _! ~. P) smov eax,1
) m2 V9 p7 b z5 g2 M( Hcpuid# N( a* l* x; B! ^# q
mov iEAXValue,eax/ o( d, u% l' k2 s6 A- H7 C0 s
mov iEBXValue,ebx' E8 X3 O/ u% `* D- W2 A5 T( u4 }
mov iECXValue,ecx0 F! u6 S4 s+ z( _" [2 F# S2 B$ N4 R
mov iEDXValue,edx
. J m- q; t- h}8 `9 n* X. }3 X7 ]5 U- z
if(iEDXValue&0x800000)8 b1 ^ ~( C2 S. w+ S
cout < < "This is MMX CPU"< < endl;
. Q5 I& _9 U9 H( I I/ p6 d( R, Melse
# l, J/ w! E) C% J% icout < < "None MMX Support."< < endl;
: G s+ C% e, r6 u/ ?int iCPUFamily=(0xf00 & iEAXValue) > >8;
( Z7 Y/ d6 k$ N' h1 @% C' [, s% F! Vcout < < "CPU Family is:"< < iCPUFamily< < endl;
! E6 S% W& z$ J2 ]% k) X1 O_asm{
9 s+ k# d, Z/ A- R' ?' f9 Umov eax,2
) H& k S7 w& x! U) `6 b* k4 cCPUID
( U- H$ l$ u9 D$ ]( r. N ?}
0 w) `' D1 V8 @, Pif(_AL==1)
% Y+ P$ c9 D+ C% Lcout < < " entium Pro or Pentium II Found";
% E C% V5 \5 ]( l T4 y6 Hgetch();
& d, ?; v& Z( W- f( @, qreturn 0;7 [' s* j. V8 M4 u4 z4 E
} |
|