|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:* k8 G3 Z' g* d. S: X* w ?
9 C" a# m# I8 I; k+ I( t# |( YIntel 486 以上的CPU,
! G2 ~- l; B1 X. B6 B0 vCyrix M1 以上的CPU,
) E( L, Z. L& P' d0 ]AMD Am486 以上的CPU
, L W$ K, X# G2 H6 {% X
. f; x: y" ~5 Z, t, W' Z: o2 ^, ^4 z (1) 取CPU OEM 字符串, 判断CPU 厂商 9 O h0 o+ s" o8 U" T( z' [3 _2 ~
先让EAX=0, 再调用CPUID
$ ?' l6 Q8 }, f Inel的CPU将返回: ; k) X* _! Y2 F/ [2 j# O: S
: h+ S# n0 h: m1 D, I* V; t
EBX:756E6547H 'Genu'" {0 f, t2 L4 s7 z
EDX:49656E69H 'ineI'% v4 c& b& A; y% u6 c$ N. B/ k% l
ECX:6C65746EH 'ntel'
4 h+ Q! }, r. H7 q$ CEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
* Y4 }, ? [! K& ~+ U$ Y- ]0 U
# Z$ m1 c4 b7 g: I, F% l& eCyrix 的CPU 将返回:: a! a" |; ?" b' y# d i. s; Q7 Z
. d; a# s' i7 u& d6 |1 bEBX:43797269H" a5 H3 F- [: D. K0 A
EDX:78496E73H
6 ^" Y/ @0 g8 t7 T$ q4 eECX:74656164H" j v; y5 i4 u. C5 e- X
"CyrixInstead","Cyrix 来代替"。
4 E" X+ E) Y- N( ~( r4 J: B. H8 K% I
AMD 的CPU 将返回:
" ]4 B6 T- b8 l" Z% J
( U5 j1 W2 Q8 t0 V8 ^+ S( {+ E, v' a7 nEBX:41757468H+ p+ F ^, M4 B8 N9 _" j, l/ Z
EDX:656E7469H
' z- z: Y, R8 n3 C) N4 x/ h: P' ^) wECX:63414D44H
0 M% Z& ]# L5 T"AuthenticAMD", 可信的AMD。, G; M& y% h) |1 l) ?- ~
' l1 X1 K \9 f" Z" k
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。0 K6 ?0 Y! y/ j1 U3 l4 ]* a& V
% f% P9 S4 j& [& ?' U8 M/ K/ K5 Q
(2)CPU 到底是几86, 是否支持MMX
3 [* s9 H# x: u H/ e# X% t# f 先让EAX=1,再调用CPUID
. F! V; s# ?. ~ EAX的8到11位就表明是几86 : u& z, ^! X2 \6 ~, g9 S4 I! ~
: J% N: n. J' c( v9 {- |3 c5 ~& F3 - 386
' A& n) e' h+ P: }: p6 e& b1 h! K4 - i486
( ?& _2 t3 \9 L$ r H% w0 O/ m5 - Pentium0 B t, @- ^6 R5 A
6 - Pentium Pro Pentium II
7 `+ E3 _/ q- l2 - Dual Processors v8 x3 _0 X5 h, w4 |: C
H# ^4 j; U. Z2 U$ g
EDX 的第0位:有无FPU
I8 S+ m$ t4 c* J8 _; j
) }+ H1 v) E2 ^$ J EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 2 g: J& N+ h' h/ G& h
2 H3 [) H( r Q* E9 `0 V( Z2 L5 I (3) 专门检测是否P6架构
a$ ~6 o$ M, L: z 先让EAX=1,再调用CPUID
1 G' M' h- M" D6 R7 `+ I4 r* S 如果AL=1,就是Pentium Pro 或Pentium II
$ Y- ?' U: \3 ^4 |/ G: \$ | (4) 专门检测AMD的CPU信息 ' }) U9 c5 ~4 @0 W, s
先让EAX=80000001H,再调用CPUID
' o/ c# b/ D) D& ?: o- u% I! e" ^ 如果EAX=51H, 是AMD K5
$ [: I0 h! p m 如 果EAX=66H, 是K6 3 @4 z" v Q! L( D7 c* a
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
# N; U' {) ~1 |% e EDX 第23 位,CPU是否支持MMX, ) G. B m( C: e( |
" k( l4 Q- w' s# F 程序如下:
, e J" g, a6 c4 y1 b. j; Z8 q1 }/ a7 q% o
//------CPUID Instruction Demo Program------------
& E4 ?* P6 y3 u: @1 ]& Y; s#include & k5 J0 C2 K* x/ u
#include
, `1 @0 f% x1 _! W! {7 R#pragma hdrstop
0 K- M' @. W! K: r" l3 ]//------------------------------------------------
* g: b4 X. ?( O. |. P' @#pragma inline
2 x7 {* l) o3 m3 `9 L1 K#pragma argsused( a2 \- H4 [* R7 y" a9 W2 i4 W
int main(int argc, char **argv)
; x9 y% m& y0 |' r{( Z" I) u$ M7 K6 r1 y
char OEMString[13];8 h6 u# j6 W0 m$ F) m
int iEAXValue,iEBXValue,iECXValue,iEDXValue;5 E ^: X$ _9 f$ o
_asm {$ `/ e( L+ e G; I) H
mov eax,0
! u9 O0 \# y( Z3 y% jcpuid
' D) U0 A, B7 j/ h7 j+ x: E3 o4 l/ imov DWORD PTR OEMString,ebx
) M p7 ?6 |/ ~9 J9 m1 A n, [3 Hmov DWORD PTR OEMString+4,edx* j7 B4 y' X8 X5 ]/ d: o' Q: j! v
mov DWORD PTR OEMString+8,ecx
& X+ Z: U. U) P* rmov BYTE PTR OEMString+12,00 h6 `- r# l' H- M
}! z# h- R3 r s9 f; t f8 O! N& d6 W
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
( w V) c+ [' d& ~+ O_asm {
! H; o2 I" W! C; T" Y6 z5 X+ Omov eax,1& I/ k4 Y2 \; q4 \3 S: [/ i
cpuid- B; P2 v( n% [1 M
mov iEAXValue,eax
( H: a9 [+ K3 z9 A' Hmov iEBXValue,ebx; q3 V! U$ I+ N* Y
mov iECXValue,ecx7 [7 L$ X! q( ^4 H) A
mov iEDXValue,edx
" y) T1 A+ a2 a* k}+ G* J0 I+ Q- s/ |+ {
if(iEDXValue&0x800000)
0 U0 I2 Q# v) d2 n: ?+ C. scout < < "This is MMX CPU"< < endl;
/ m6 E" e7 C. l& kelse
6 b m( ~8 R0 E7 }cout < < "None MMX Support."< < endl;
4 Y, j' D& _. A+ f) J+ Qint iCPUFamily=(0xf00 & iEAXValue) > >8;
. f9 d# V6 t4 ~* V- e/ I- qcout < < "CPU Family is:"< < iCPUFamily< < endl;& C* [# ?9 ^3 Y! B* u# \
_asm{
) o2 f( ?. s5 S0 j4 t& E E3 gmov eax,2
# S q. U& K: J( y _, s+ oCPUID0 ?( r/ `; z5 f% E: b! |
}4 v/ z) a& j/ B& F/ ?
if(_AL==1)
! A4 d3 T% `) R, Lcout < < " entium Pro or Pentium II Found";
2 X, Z y% C% d% l! h6 J6 |getch();2 |/ S7 G! C% f6 S
return 0;
T: L& Y3 Q, x0 v} |
|