|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
/ u4 M* k: q: A. p/ C5 A4 X, g1 Q: `$ Y# ~2 O, v# i: j
Intel 486 以上的CPU,
: M) x0 c! m2 qCyrix M1 以上的CPU,
) @8 I6 @1 q% N+ zAMD Am486 以上的CPU
- f$ M+ K: ~# {1 g1 H( O7 V, o h* M" K' [( {* h: a
(1) 取CPU OEM 字符串, 判断CPU 厂商
7 j! L0 r8 U0 ^& b9 z 先让EAX=0, 再调用CPUID + T5 |1 p* r9 b! J8 C
Inel的CPU将返回: 8 G: C8 h1 }) @1 w* P$ m. o
( \2 |; h3 r4 b. |8 p: _) J
EBX:756E6547H 'Genu'
1 A. @" e& e( ]3 b1 o3 l e& HEDX:49656E69H 'ineI'
. W) \5 ?* E2 V" o: E6 w$ kECX:6C65746EH 'ntel', M+ O" ] N6 z
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。" c! l. @" O0 ~- U, V
) y& M: p3 S8 Y1 N/ fCyrix 的CPU 将返回:
" A2 I E* _( z* \% q9 K2 Z4 o& @4 e
5 w' k* @4 l' P" f9 p7 OEBX:43797269H7 C4 O* G2 }& y) _
EDX:78496E73H
$ {8 Y/ ~& ~: g3 M. l7 nECX:74656164H8 i% b8 u8 G: k6 y
"CyrixInstead","Cyrix 来代替"。8 M7 T* T3 c4 y5 N9 n
! }8 j2 U: l `
AMD 的CPU 将返回:
% b! n2 C+ g1 S% R/ h' O* A9 x4 j+ b R6 d( x& }
EBX:41757468H' h+ ?6 ^1 n( J, H% S2 G
EDX:656E7469H
7 |- ]: L, Z' FECX:63414D44H
6 Y6 J0 j. b' B: z7 v8 t0 ]"AuthenticAMD", 可信的AMD。# @+ k L- ?% [
3 A3 ]9 W1 l2 Y8 z$ s 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。8 Q' x9 i. m# }& R$ V% }
% l1 y! x( f' r' D: j$ w (2)CPU 到底是几86, 是否支持MMX
4 ~$ E! p6 u6 y6 Z% k% j) q8 S 先让EAX=1,再调用CPUID
j" A6 G7 Q" R, |# s: u3 f EAX的8到11位就表明是几86 8 E+ n( i. f: ^: S
' Z7 w0 i8 ?! [+ d0 j! \+ j3 - 386" l5 m6 }4 h( b/ d# D4 @
4 - i486
9 ]- n1 ~) G2 K1 R1 X5 - Pentium
6 {8 I# s% i# I. l9 D& c3 y6 - Pentium Pro Pentium II
+ C7 I- v* ~$ F" d& _2 - Dual Processors
5 k$ v, Z3 f) o* l
4 c3 f+ Z" O3 W EDX 的第0位:有无FPU
% @; i6 H: O2 l- e7 S5 i3 g( b1 k% ]& D) s) p% l5 y5 B
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
; @3 R Z3 K0 H/ d4 G- e j/ t- n: _3 O1 T1 V+ t3 ^$ H
(3) 专门检测是否P6架构
" z7 G" Z! |; R& l3 e 先让EAX=1,再调用CPUID 2 n0 ^7 O+ f1 t4 M2 j7 Q5 \
如果AL=1,就是Pentium Pro 或Pentium II ; A9 s0 n2 r, g( s, G8 U6 y/ f3 ^
(4) 专门检测AMD的CPU信息 4 t) B4 E8 N! \3 h. |3 R5 `
先让EAX=80000001H,再调用CPUID
* N# i" O* z& U' T 如果EAX=51H, 是AMD K5 9 r# B7 t" d8 _
如 果EAX=66H, 是K6
+ |% K7 N7 u$ ]& z2 h% ` EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) * N. ~/ w( o5 d
EDX 第23 位,CPU是否支持MMX,
" A" u1 h, _$ i3 p* O% Y j2 D/ h2 e4 c2 x7 ?# ^
程序如下:
4 G0 Y4 P1 y8 p
2 B" M! Q: Q8 [" X2 K1 X. o/ S//------CPUID Instruction Demo Program------------
1 z- [ r: ~/ E5 Q2 O$ r( K7 S#include 7 q& F: K7 H; A# ?$ O
#include
/ I: `! H( Z( L. }#pragma hdrstop
9 v4 y% D8 Q# u8 d- K5 y; |" b//------------------------------------------------3 k" J7 J' g" j
#pragma inline
2 a1 g( O* I5 E2 o0 b) n6 E3 F#pragma argsused9 }6 B6 u; J7 O, m2 |, W9 ~
int main(int argc, char **argv)& E2 _- n+ C+ V) g5 |- [" V" {
{% b7 n% d, ?) T( X
char OEMString[13];8 _1 S% i" N$ t3 W* s7 k' u
int iEAXValue,iEBXValue,iECXValue,iEDXValue;( p G$ C& \9 ~6 [8 F
_asm {
# [% i# L. P1 b, K5 R) [mov eax,0
$ l1 o; `2 Q- L) Ncpuid8 @; y2 ?9 y) B2 @9 s9 A
mov DWORD PTR OEMString,ebx
; p& M% a9 @: M. v8 dmov DWORD PTR OEMString+4,edx, b5 b- @( A. [8 D( R6 P$ ~/ @/ q8 X
mov DWORD PTR OEMString+8,ecx5 i4 }" I% P' z Q7 E+ S5 v: p$ K9 B
mov BYTE PTR OEMString+12,0* \& B7 ?) M; R" D0 a+ \% e
}. q& M& F X" `9 t* u
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;( |, `: J2 J5 I8 m$ G+ ?5 z
_asm {
) Q8 L7 ~5 E' `# c0 u) c9 z/ J% ^8 Umov eax,1
! R0 {2 I: M! c! F0 C' Lcpuid, ~7 y* T) z2 H& t1 n
mov iEAXValue,eax8 M0 \( l- q& @ I0 ^. q( ?
mov iEBXValue,ebx) c, N, W+ X9 C2 B e A4 M. g% u
mov iECXValue,ecx
4 l# ]& l: G9 s8 {* o; |mov iEDXValue,edx
2 C6 j- G- c1 L+ Y2 \9 `; p6 g}
' c7 w- p- R+ z, Pif(iEDXValue&0x800000)1 j; d$ @8 ]. L' q* @. @# I/ H5 Q
cout < < "This is MMX CPU"< < endl;9 X- r1 }* C( f
else
9 b4 K6 A0 v2 `7 v3 mcout < < "None MMX Support."< < endl;4 {. b; r& C S4 X2 u S
int iCPUFamily=(0xf00 & iEAXValue) > >8;
" W/ z$ h6 A! y! ` Ucout < < "CPU Family is:"< < iCPUFamily< < endl;
& f. \. a5 N' V5 n( ?_asm{
: M q/ y" T. p$ m" V% Tmov eax,2+ I1 W/ D0 C1 q# ?) d R+ t
CPUID% b' s# f( L+ x' _* K" v8 B Y
}
/ r! n6 }$ F7 _2 n0 N& r& Rif(_AL==1)* v/ W8 Y7 \$ G% ]' y& t
cout < < " entium Pro or Pentium II Found";
' D$ ~% F4 p* e ` Ngetch();
8 q0 ~, p# _* x# p6 ?return 0;
6 s8 h5 a! l6 i; x! y} |
|