|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
6 i/ T( ]& V" `5 M) p) j/ ?% g3 u* n* P9 r
Intel 486 以上的CPU,% O+ c3 E. D3 T$ n
Cyrix M1 以上的CPU, m# Y& M2 T! z* A! A0 \/ t
AMD Am486 以上的CPU0 L% O I* }8 W) ~/ z
3 s& a) O& z8 Q2 [ (1) 取CPU OEM 字符串, 判断CPU 厂商
, W: W& F! X9 C, N 先让EAX=0, 再调用CPUID ! q6 u6 F: R0 y% F7 H5 Y
Inel的CPU将返回:
( t0 ]' H; t" ^; E9 N$ t D. f' o6 _3 U4 l0 r- [5 _) @4 |! A
EBX:756E6547H 'Genu'
+ r- d4 q* G3 q( {EDX:49656E69H 'ineI'
# G- g7 H% M) Q) m! |: {- QECX:6C65746EH 'ntel'5 N% i! k1 t" W- Y" a- M \& e
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
: A1 ^8 }' W, G. j! Y$ G; p' p) T8 N6 G0 `7 T9 c [8 @! B. S
Cyrix 的CPU 将返回:& i! q; J8 `' y$ v' W7 P; Q0 e3 j- e) b
* |! s A r8 s4 m+ j( @
EBX:43797269H
7 X5 r3 @5 i$ A2 |EDX:78496E73H- E/ s/ M. L* T/ M6 m( E
ECX:74656164H
& L1 e* m. B5 B7 s- Y4 k"CyrixInstead","Cyrix 来代替"。
* ~! _8 a% I. k3 T) A, j* }( W$ W. x
AMD 的CPU 将返回:" V- `$ X! N2 T
' r; K* Z! y' f* A! ?
EBX:41757468H* g5 W5 _/ c* E, K4 }& z+ Y
EDX:656E7469H9 c% D' v* G" z" q$ Q2 E5 K+ F
ECX:63414D44H- O& f( s0 ]9 B- ?2 \
"AuthenticAMD", 可信的AMD。
# Y+ D( G+ v6 M" w( t* y$ u+ C8 {5 o( d" j4 S
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。( O- n% A* c+ D
3 A' C& d2 y) Q6 N$ ~* a
(2)CPU 到底是几86, 是否支持MMX " t; p X" _- ?! l- W5 i4 U2 a
先让EAX=1,再调用CPUID 7 x4 n$ d2 `- b: j' z
EAX的8到11位就表明是几86 5 K+ K3 c; H; a+ E
* T) ?! G+ q% n) r/ w4 y
3 - 386
9 E7 ?6 e K' E* m8 Q( W4 - i486
6 t8 a. v% e. k6 d) V6 u: b( u+ `5 - Pentium
' J0 u" T* A2 L V" Y: x6 - Pentium Pro Pentium II/ g H0 G. e, l& I5 ?* M2 x; ]
2 - Dual Processors# r1 E8 F. ?# M4 T2 `
2 K( Q# b9 R1 J' J5 P EDX 的第0位:有无FPU, Q. }: _* Z4 c1 ?) K
& m1 E5 s( ?- C: Y
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
/ C3 |0 m$ T& X3 W: H7 H6 R* W9 }5 i' `) a/ L
(3) 专门检测是否P6架构0 M! I$ j5 Q7 k$ J' Y) [
先让EAX=1,再调用CPUID h5 H' t N& p8 u: m# G U
如果AL=1,就是Pentium Pro 或Pentium II 8 W+ |$ L1 N; F/ q
(4) 专门检测AMD的CPU信息 , b* J- i$ V* h4 l9 ]* ?
先让EAX=80000001H,再调用CPUID
! L" }; @/ o7 t! K 如果EAX=51H, 是AMD K5 G% A4 ] n, I: f' n( h
如 果EAX=66H, 是K6
1 i! _# H, ^0 s# {- g- K3 y EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
H" i2 ?4 o- [2 L& l EDX 第23 位,CPU是否支持MMX, ; M3 e9 ^* i; X, w) Z
; d) S$ M% Q C0 w4 g
程序如下:9 p0 a1 C, b8 d' J" w2 d9 C3 S
) b9 M. o; O3 E/ G. B f- ^3 R//------CPUID Instruction Demo Program------------
9 r$ h7 ?+ w2 ~: f: A#include 4 c4 m$ T. d X/ k! ?0 I% `1 \
#include
- z) B4 L$ }2 l* R$ J1 k#pragma hdrstop
. `# e$ i5 R0 P+ {//------------------------------------------------% n# A7 o# }" h. L1 ~
#pragma inline4 U6 I- S. j8 @3 S
#pragma argsused
/ v4 m" h) W9 D$ k iint main(int argc, char **argv)% U7 H/ L# x* }2 K, a
{& ?5 L1 f/ Z$ h% R D, X
char OEMString[13];
p* L* f' ?7 k1 }5 l; [" A0 tint iEAXValue,iEBXValue,iECXValue,iEDXValue;
' U& a9 m( X, z, m$ G_asm {7 W! ]. H: c# N) f, I( A1 T/ J
mov eax,0
. S9 N+ W$ ]- t' d8 Qcpuid' G8 v% y; W" }0 V3 U# W2 `
mov DWORD PTR OEMString,ebx
- n- \8 n$ @) |- W/ Umov DWORD PTR OEMString+4,edx7 ?7 ^( {. }# k, I- f/ \
mov DWORD PTR OEMString+8,ecx
3 s/ @7 M& I( o) x$ f( K/ tmov BYTE PTR OEMString+12,0* Z, p8 T9 G& d9 O1 A+ H N
}3 d2 D% e1 d1 P) w: j7 D
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
3 r9 x* s% p' _; W- W" R_asm {
" I' y6 U* s8 G( I8 w2 k }mov eax,18 }8 x3 O( t$ p4 {1 `# l9 R# \6 f
cpuid) a9 e% ^, p, |: O# `
mov iEAXValue,eax
, G* p% F+ S0 T6 X/ m- {8 L rmov iEBXValue,ebx% R/ B4 r& { X, C* c8 w, Q% h
mov iECXValue,ecx
: t U" ]7 j# T# Imov iEDXValue,edx6 R, ?1 W9 K. j# I3 \
}" n5 r+ y) | p/ A7 T
if(iEDXValue&0x800000)
, r6 f" o+ d( O6 ~- x! ncout < < "This is MMX CPU"< < endl;
# \4 H/ w" E1 t3 ~else0 _2 N( M% J$ V+ a& F$ y6 y
cout < < "None MMX Support."< < endl;
1 H; s3 ~: v) d- O0 P: Y9 }+ Jint iCPUFamily=(0xf00 & iEAXValue) > >8;
7 ~7 ^8 m( D# Tcout < < "CPU Family is:"< < iCPUFamily< < endl;5 c6 u ]- K8 Q
_asm{
# E$ N$ L( h% Q' {, B" J. imov eax,2
" }: W! L ^$ o' s0 S% hCPUID
; C, o# q0 s( y6 A7 a- H# n1 \" s" B}
6 ~+ K' G. h0 U: P& p: eif(_AL==1)$ d; f. @$ W" y( q( i* W5 i
cout < < " entium Pro or Pentium II Found";4 {; o# E. L' y+ Y; u' y S
getch();# ~$ ~1 g& m1 E9 I3 E9 i1 k
return 0;
, `. U2 j6 ?( G) c- I4 D" m- {7 e+ I} |
|