|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:" l$ F6 H% g3 u( I
1 Y1 y/ V+ `7 u% V, O/ _
Intel 486 以上的CPU,1 x5 S3 |0 p R3 k+ u
Cyrix M1 以上的CPU,
8 K: j( {& M: @& w( V5 e& a& tAMD Am486 以上的CPU
0 _ c/ r- w" p% j, z; R2 \! Q* {
; W6 D: A" t# t (1) 取CPU OEM 字符串, 判断CPU 厂商 4 L8 A% B7 q" P4 D3 i G
先让EAX=0, 再调用CPUID 4 q: M' L, H y
Inel的CPU将返回:
" w! B% g z1 p
5 O- j0 M( u; C F! z4 L0 NEBX:756E6547H 'Genu'0 U/ U) l; e3 C c; m2 M
EDX:49656E69H 'ineI'% ?1 S; y6 j6 N: {7 {
ECX:6C65746EH 'ntel'" g1 q: G: w X% a/ e t
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。7 ?3 q M. R% q# j' o1 n1 q. N! X( e. ]
+ x* @. ?; f" p @9 C* ]1 Y0 e. A
Cyrix 的CPU 将返回:- N0 ]6 M+ a& @; y4 x# J
6 c$ @ j* J3 D" e5 k5 yEBX:43797269H! l: E8 W, z0 |0 a; G* A( C
EDX:78496E73H
1 @$ E! A9 I) X/ v8 C6 c$ l2 [ECX:74656164H
2 o+ E( m4 p" |7 W; b* U+ m/ N"CyrixInstead","Cyrix 来代替"。
' z: a% A* q3 v, m. f& ~& N8 d+ d; R) E0 o
AMD 的CPU 将返回:
" V" P! G8 ?# P0 c- X0 |" A( a. B' w: b$ Z. _& [2 }
EBX:41757468H
" H" p# P) k4 K* IEDX:656E7469H
) M/ X$ M4 t8 n. {* QECX:63414D44H* J! L6 T6 P+ p0 P
"AuthenticAMD", 可信的AMD。% i2 l" u# ~" @ J6 d
" l; N4 j z2 w- u8 ?$ a 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。' ^0 u0 Q" }9 A7 L! E
. C/ n7 m2 _5 u- F1 g& U9 D1 v3 b
(2)CPU 到底是几86, 是否支持MMX
# h% L% S0 b5 |4 f9 K 先让EAX=1,再调用CPUID
$ b3 H, V* K* q) i3 G EAX的8到11位就表明是几86
4 x9 m) R* I( {) l5 `
+ C( K, L j/ b3 - 3860 H* \( |' B. S4 J* \7 k
4 - i4864 {- p- {" h p$ A/ F
5 - Pentium
! v$ [1 n1 n0 L6 - Pentium Pro Pentium II- m$ L, s h$ J* o$ X' | e
2 - Dual Processors$ H8 p/ s: Z0 e0 x9 {% w
% x7 U! A* R" b" U EDX 的第0位:有无FPU: Z @, ]7 L6 F, i$ r3 b$ W; [* A
D6 o0 @+ O; @* O+ ^) H
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
# x9 W2 \$ \9 k7 c# ~- Q6 b2 Z$ [; u: H$ {% e9 g5 Y
(3) 专门检测是否P6架构
& H2 h* l: X0 `" u9 Q 先让EAX=1,再调用CPUID : d" O3 x: d/ F
如果AL=1,就是Pentium Pro 或Pentium II
1 q6 l5 N, G% A8 L) N m8 R" g (4) 专门检测AMD的CPU信息 5 X p* p- s$ i7 l/ v" i
先让EAX=80000001H,再调用CPUID 7 h4 Y: q( E% l: s$ V+ ?
如果EAX=51H, 是AMD K5
8 B0 Q' s, b2 _7 }% T, g 如 果EAX=66H, 是K6
$ J9 O( @% E. R) k# @ EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) ; z; m# s$ E8 ?. E; _
EDX 第23 位,CPU是否支持MMX, # N9 K6 H" j$ n. K" u# x
' B2 L3 F$ J- I( M* W# B
程序如下:
8 Q: L9 K5 n* D9 h$ A% q$ E! d7 B. D7 S& w7 q; G+ ?( d+ H
//------CPUID Instruction Demo Program------------! ?0 A( p3 V5 d8 h% j0 t
#include
; i! r7 _$ y/ i#include
& V2 Z; ~6 V. m' t& N. e5 H) E#pragma hdrstop8 B& P3 j! s( q7 `
//------------------------------------------------
9 R3 J9 [% I5 k#pragma inline4 t4 w: E! r3 A& Y0 [. ^
#pragma argsused! Y9 c6 [9 T) ]
int main(int argc, char **argv)1 J0 Z' m! x4 p( m3 |4 t
{
* n c. ~. c% Z( M3 Q K; tchar OEMString[13];
( G. {7 r' X, F& k0 Jint iEAXValue,iEBXValue,iECXValue,iEDXValue;3 F/ d b$ j" w# f: z3 E" ^
_asm {
( ?/ U( i$ T$ p U1 M) q! qmov eax,0% [+ d4 {, z) M* J
cpuid' {1 N; T2 W& L% M+ ]4 ^
mov DWORD PTR OEMString,ebx" I- g& f3 h6 e1 m i6 ]% H5 ^
mov DWORD PTR OEMString+4,edx
3 k$ B9 l8 w% D3 G8 |% o! }mov DWORD PTR OEMString+8,ecx) N5 c# u4 s, k l d* ~
mov BYTE PTR OEMString+12,0
7 G9 h# x* B5 \7 t; a}
4 K- |# J- f6 ]+ Z1 Y+ q1 Ycout< < "This CPU 's OEM String is:"< < OEMString< < endl;
. n5 a8 h1 e4 j/ D; @, R7 d- j_asm {
8 R6 F* R0 V. q0 Emov eax,1
+ V E* T- {5 Ecpuid
% X f, P* n4 {7 lmov iEAXValue,eax1 a# G/ X/ Q; N& k4 @4 v/ P% D/ d& t( [
mov iEBXValue,ebx6 n: J- l$ P& q: I3 h
mov iECXValue,ecx$ f0 C7 _$ \( F8 ?8 V" U
mov iEDXValue,edx
- U' J- f# k: n0 d}* ~8 P7 l7 T7 [. o5 }7 [* N
if(iEDXValue&0x800000)+ s# B Y8 o, x, z
cout < < "This is MMX CPU"< < endl;
, b' Q3 M7 p% i `0 selse
' [5 E8 L" Q+ ]) C. U$ j- Pcout < < "None MMX Support."< < endl;- Y. Z6 X5 _% K
int iCPUFamily=(0xf00 & iEAXValue) > >8; F x: i- ~) B
cout < < "CPU Family is:"< < iCPUFamily< < endl;
+ ` j" B, A3 {* m_asm{
5 {. K/ S9 y9 @1 `. { Fmov eax,2& l4 f! F! r& Y5 e. r
CPUID4 }3 P$ h" d% E( N3 L
}; l7 r; U/ Q; _+ P5 E' F7 O
if(_AL==1)! o3 G* N; J$ E& W% g& r
cout < < " entium Pro or Pentium II Found";
7 E# a8 b( w& M9 d8 k( zgetch();- f% F+ j2 V) v/ |
return 0;3 @" w% {+ z* A* E. |( C& B1 g& l' T6 K
} |
|