|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
* B3 ?& \0 w5 o
6 ~# Q& q8 _ M( G0 N. M" UIntel 486 以上的CPU,( z! @$ I: h- s) v( g+ b
Cyrix M1 以上的CPU,# {6 n7 Q: x- |# i
AMD Am486 以上的CPU% G0 P, U) y9 q' T$ [
( E1 L' A- G2 L' y0 q9 W- n* X0 r& N. y( P (1) 取CPU OEM 字符串, 判断CPU 厂商 - [+ U# ~3 M4 n1 V. R
先让EAX=0, 再调用CPUID 9 k% D/ T1 x5 o0 X- M1 F9 `/ H, J' d: @
Inel的CPU将返回:
4 p3 g' Y; A- q+ {* d8 ]2 x5 O* t
EBX:756E6547H 'Genu'9 y0 V* T& }4 T* D( j
EDX:49656E69H 'ineI'6 U5 K7 c1 h$ d( k1 `
ECX:6C65746EH 'ntel'
1 _2 p0 ^4 C3 x3 z+ KEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
7 Y2 Z: R% t/ y: q5 A8 b! J, \( Q" A. E, q: M7 b; s
Cyrix 的CPU 将返回:+ F y2 u' ~1 ~1 U/ R& h
1 Q' h z' S: h+ z9 w' eEBX:43797269H5 e. J L! |# N$ V) ]/ O* i3 Z2 l0 L
EDX:78496E73H5 G$ N/ s7 q8 q! R
ECX:74656164H+ u. N# x) F* V/ ~
"CyrixInstead","Cyrix 来代替"。
" i# J+ }- N1 h/ f" G7 S% m. h* q. B' x) K% \
AMD 的CPU 将返回:. K2 a6 L7 I* i1 g
) a( n( T, m9 m5 h1 B
EBX:41757468H \4 n( d5 O8 L+ E/ _# ~. `
EDX:656E7469H' [7 ^4 E2 P" S E
ECX:63414D44H
1 w {5 a4 g+ t2 y, {( ?4 n2 G"AuthenticAMD", 可信的AMD。
2 ~; {. c: f, U6 q1 J8 C
* M+ k. G5 S" b1 F9 P' q 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。7 F5 r- l) F2 k X: E y; ^
4 E" ~' Q- e( g! s( p: ~+ w& e
(2)CPU 到底是几86, 是否支持MMX
- o0 E6 s- d9 a4 ` 先让EAX=1,再调用CPUID
- q/ {( U1 I1 ]: ~: I0 x2 O EAX的8到11位就表明是几86
2 V. ?* a( R. x' |
r6 H5 A% X) ?% A' Z G3 Y3 - 386
5 }+ p4 H2 Q& x( ~$ L J! p4 - i486
/ q: _2 |' W" ?% N" w% e; i5 - Pentium3 Y, q# {4 ~* H) e6 K g
6 - Pentium Pro Pentium II* ]& C& I' P! H3 q5 j
2 - Dual Processors
: v, M+ e1 \ p( T8 \ D5 E
" N1 b3 ]! m, k( U& M3 k' F5 M EDX 的第0位:有无FPU
9 u7 B8 q. ]* J6 B0 x2 W1 D v# B5 ~0 q- K6 v' j) ~" c
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 ! U# ]( ?- q, k& `2 g8 ^$ a
5 F7 o& L; M, q1 W (3) 专门检测是否P6架构
: Y9 F* O* _+ e2 a* } 先让EAX=1,再调用CPUID & @, v( I9 A, D0 V( e+ U8 p! }
如果AL=1,就是Pentium Pro 或Pentium II ' d' x" L! P: \
(4) 专门检测AMD的CPU信息
9 k+ o; Q" X5 C9 v3 A 先让EAX=80000001H,再调用CPUID 9 s }8 X5 X; C' O7 x8 M
如果EAX=51H, 是AMD K5 9 V- }. c: T) T9 j5 R
如 果EAX=66H, 是K6
) R0 B# O7 S; w8 d X1 J EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
9 U3 P. Q2 j- ~ W+ G) c EDX 第23 位,CPU是否支持MMX, # P! n' P& U# W# z* ?! P5 t. {
) `2 q& w/ V) A f- n! B8 x% [5 @0 C3 U 程序如下:! M6 o: H: e. {' D6 _
" k* L6 F7 P6 R# d/ j, P( ~
//------CPUID Instruction Demo Program------------
$ V: G! ~2 L( l$ Q/ \#include
7 q; q6 H1 a; T7 e1 o& B) V#include
6 h5 d9 |( o7 o, Z \, x#pragma hdrstop
& G5 n" C# }5 W( ]9 m3 }6 x1 F//------------------------------------------------
( M3 r& R+ \3 b t# G% a#pragma inline
$ v/ I) c9 o% e* t# ]9 c7 t9 L#pragma argsused
' i* b0 F4 l. Rint main(int argc, char **argv)
p% `! Q4 R \+ t{
6 i8 k' Z, C6 K5 F# Qchar OEMString[13];
& d2 U# }1 F" M* u1 u- B7 z# Bint iEAXValue,iEBXValue,iECXValue,iEDXValue;
* ]: L* w$ C$ U2 m x3 v% _. ]% s_asm {4 {" f( S; ^5 ~
mov eax,0) R; Q, F) ]2 t$ K0 U8 A! G
cpuid* O/ {$ T, Q5 o9 ~( q) U
mov DWORD PTR OEMString,ebx
: L5 `. {/ a' v7 gmov DWORD PTR OEMString+4,edx9 E! E' H8 t# K5 h& m+ G% ?, [
mov DWORD PTR OEMString+8,ecx8 K3 ~& _# g/ @( {
mov BYTE PTR OEMString+12,0& T, H2 h0 H+ t% m( w$ W4 v
}+ h5 Z/ y) g+ j- y! ?$ {$ @
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;* ^' `' z9 n2 u. f1 |* Z3 L X
_asm {
: a3 _6 H. L( qmov eax,1
7 L4 t H9 M6 L4 u, H& Ocpuid& q$ t$ d3 Z- A+ P
mov iEAXValue,eax$ x, c$ q7 x/ `3 s V
mov iEBXValue,ebx
1 v& O. ^0 n4 U" S$ S" Zmov iECXValue,ecx& [8 @! }+ Z6 d+ {4 @
mov iEDXValue,edx
: r) \) C0 k' p8 f }}
" z2 `' ]; {3 Y- mif(iEDXValue&0x800000)0 ?1 S4 Y2 N8 \2 }; r' ^
cout < < "This is MMX CPU"< < endl;
# _" X$ ?9 A/ j' ?else
- d% X2 u- h* F% R3 Y$ D; e( G5 G8 i8 pcout < < "None MMX Support."< < endl;
$ |0 z, N: g! ]1 Q3 Rint iCPUFamily=(0xf00 & iEAXValue) > >8;0 L c# |1 z% M. S* \( Z
cout < < "CPU Family is:"< < iCPUFamily< < endl;6 w+ r1 ^+ @) L; U4 R0 `
_asm{( ]! t9 f% ^& ]4 R* r2 ^% w
mov eax,2
6 J5 f1 r& E5 M; \CPUID3 K. K& Z% i- v, [) [* E1 {8 P
}
% T, u3 j# E3 i1 L6 f2 ?7 _& a+ G- Yif(_AL==1)! f" B2 g; d: m8 x/ W: ~
cout < < " entium Pro or Pentium II Found";
# ]$ t. c0 C+ F" Igetch();& `6 p+ h4 \/ T+ O" t
return 0;$ e6 [4 F2 s( b5 w# z' w
} |
|