|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
, t3 x8 F U/ _6 ?9 {- P/ @
- `: D" z% v' l8 }4 {Intel 486 以上的CPU,# @1 g' M9 G# R0 B' ?
Cyrix M1 以上的CPU,
0 I1 A! c, c6 v. R" @ \AMD Am486 以上的CPU8 a1 s; u! v" V
3 i, K7 ^: d3 L* P6 L6 X: d _ (1) 取CPU OEM 字符串, 判断CPU 厂商
& w! V# Y9 k2 `5 J! b) y2 e5 L" D y 先让EAX=0, 再调用CPUID 3 _' \. l, u; x) a, P1 ?3 o
Inel的CPU将返回:
( ?) h* m; l' j+ X9 R# m l5 V3 l& }' m l# X. t/ F$ X6 |- D
EBX:756E6547H 'Genu'
+ v \# ^' z1 eEDX:49656E69H 'ineI'4 q. h# I" T6 [: m$ `, O; U g
ECX:6C65746EH 'ntel'
# n! g1 w8 s0 v0 G! oEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
- U- C2 C& }% O2 g' L: c" _) i) I# C# ]1 I: }
Cyrix 的CPU 将返回:# t; B4 a7 c' |+ a; s1 m. X2 `
3 b# H6 [: s* h8 }' @
EBX:43797269H; J- D3 g& l v# S1 X
EDX:78496E73H/ P9 c) Q$ S! L8 L; t. @. n( Z8 i
ECX:74656164H
/ s% T; p# h+ n [7 y: ?! N"CyrixInstead","Cyrix 来代替"。) g5 U P. W% O) v
( V# W3 f) \! L, X/ VAMD 的CPU 将返回:5 X- Y2 R$ s- d9 m) B2 M2 i
5 }; S$ W- X0 v h6 V9 e% P
EBX:41757468H
7 M- {; V8 A& f1 xEDX:656E7469H! \4 z- ]/ U& J4 m1 q$ E
ECX:63414D44H
& u, J5 R1 p4 Z" d5 r; T; D; i"AuthenticAMD", 可信的AMD。
. ^ O8 O' A- I0 [0 z! a, x
7 l8 E& B9 t3 W5 Z/ B" w; C 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。# I* q4 }* y4 b& y3 J
% B0 Z8 p9 d8 D* D$ ]
(2)CPU 到底是几86, 是否支持MMX
% T. n* a- k% |4 r& q; z$ s G 先让EAX=1,再调用CPUID " x, \' a$ \! w! V& \! i) i$ x# t' S
EAX的8到11位就表明是几86 " S% N7 O/ x, L6 H
8 c% u8 g4 @7 d# o3 - 386
! M1 I* r4 F/ b7 G4 w4 - i4867 X* Y2 p2 N$ n6 h) j9 x
5 - Pentium2 N1 F! ?9 {: n* }& X& o
6 - Pentium Pro Pentium II
0 K+ @. `+ V; ]& k: c2 V2 - Dual Processors7 D' b8 X/ d, P$ u% u- h5 w
$ j. Y# P' L( x: W3 ~( S EDX 的第0位:有无FPU4 s: o- Q# D0 G& C0 j! d
7 {, d% D7 t+ V' @" ? EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 * M7 S5 }; D8 E0 e9 Q# _1 I
4 Q/ T0 J( O! y4 x+ |" M( ] (3) 专门检测是否P6架构
, z7 b; e8 p; N% s4 B 先让EAX=1,再调用CPUID
8 H* {* i: c" R; {' f& P3 M 如果AL=1,就是Pentium Pro 或Pentium II # O) z2 s& L+ f4 {/ s$ Y' i
(4) 专门检测AMD的CPU信息 ) H9 H; n; p; b3 @
先让EAX=80000001H,再调用CPUID 7 B) K: P: T" r+ O! | }( f, d
如果EAX=51H, 是AMD K5 , b1 ~4 `1 m U- p$ l) I
如 果EAX=66H, 是K6
* `* c9 U& j* o) M: i% p; k; J: G EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) n, c- e/ R8 N6 k
EDX 第23 位,CPU是否支持MMX, 5 I% I. p$ A5 l8 E) i0 P2 u3 {/ I
! W; s; r4 q6 o4 i# O, g2 b {2 C; n 程序如下:
3 v7 U9 \% h: s6 [/ z- s9 A) s* M7 q" b. b
//------CPUID Instruction Demo Program------------
- t0 W9 k" f) ]' m+ p#include - _) B0 K, D$ c2 L: k$ z/ P. V
#include
- v% L# i: p7 H7 D) Z#pragma hdrstop
7 L& G; m1 U( r, _* y& y+ w( I//------------------------------------------------' K4 }8 G! Y6 }; b
#pragma inline. a4 x% h0 x9 v# [. U
#pragma argsused
1 z# G) q# U( d: G$ P+ rint main(int argc, char **argv)
) D$ O& u. N& Q6 h{* }; T0 @7 i( o* i, x3 o9 o
char OEMString[13];
% ?" `0 X+ o) }7 j s, d# X5 ]0 Q: gint iEAXValue,iEBXValue,iECXValue,iEDXValue;' L$ Z2 Y" E d) f/ |/ K
_asm {
( p" l2 E+ R2 S9 T" Omov eax,0$ X& s* l' y% P% V/ ]$ C
cpuid
7 H8 G7 V T) G/ T$ ymov DWORD PTR OEMString,ebx; d- I: e* z& n+ g- t
mov DWORD PTR OEMString+4,edx! s) m6 z1 ^9 U: @$ {2 z! L: G
mov DWORD PTR OEMString+8,ecx
0 U' b9 @: L Q! R e4 M" m5 Emov BYTE PTR OEMString+12,07 s1 L1 }) b+ U
}
5 o5 D/ X+ o/ S- vcout< < "This CPU 's OEM String is:"< < OEMString< < endl;! O# w2 I) L8 D0 l4 E) e3 W
_asm {6 Z/ h/ r: ^0 n m1 g1 n' \# j
mov eax,1( J9 m! @: d: R3 i3 n0 X/ z
cpuid+ y* R3 P n4 {# m9 m& Q! \7 x* L
mov iEAXValue,eax, D' h- A2 y" T% w' H# v
mov iEBXValue,ebx# g5 o) r1 S/ I2 g) v
mov iECXValue,ecx! E) ]. j/ i! F
mov iEDXValue,edx: ^1 J5 `6 h" z3 B+ r: b
}
4 o1 Y; H2 u9 a) ~6 Mif(iEDXValue&0x800000)
: t4 Q2 \: \6 V3 Rcout < < "This is MMX CPU"< < endl;6 s _/ k" ?% [, B0 X8 ^. B8 N! w
else% G) f5 \8 R# I+ c# y
cout < < "None MMX Support."< < endl;
6 c, o/ M1 q; dint iCPUFamily=(0xf00 & iEAXValue) > >8;
4 Z1 t! D* O4 X0 G/ ecout < < "CPU Family is:"< < iCPUFamily< < endl;
) A1 T( i2 C' w" W( p: q {: b( o_asm{
+ d2 ~6 X( i; f* s& H1 c' Zmov eax,29 b U! S i/ ^" F
CPUID* {: @+ W7 N2 q. n7 F5 T
}
: V/ o1 X( a' r' E( mif(_AL==1)1 X. E W( |( E' |% |+ d9 l
cout < < " entium Pro or Pentium II Found";& u4 @9 g) ?5 D
getch();
; ^; q, m3 L q( Z7 oreturn 0;2 z, S& V+ N$ J$ a1 o( \
} |
|