|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:& }# t2 M7 K4 H: p ?
; b2 O) {3 ?: ]0 X7 Y3 E
Intel 486 以上的CPU,
w$ [1 x0 m9 VCyrix M1 以上的CPU,+ e1 D3 Q0 ^) t
AMD Am486 以上的CPU4 }4 t# B m4 H
: |$ l/ |6 {& s( }* f
(1) 取CPU OEM 字符串, 判断CPU 厂商
/ x0 j: j& |. o& @1 N+ o: y 先让EAX=0, 再调用CPUID
; `# {$ G4 ]( f# Y* N# S Inel的CPU将返回:
* Z' y( t7 d: B! \; B& n1 i# H1 j( I! P0 z* y) u2 S k8 S
EBX:756E6547H 'Genu'
, g% q3 P" G7 _( m4 y& TEDX:49656E69H 'ineI'' F( g2 z- y8 h& V1 h; W
ECX:6C65746EH 'ntel'
6 p* C, k& e9 a: x- EEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
( d6 }' e5 s" G+ l
4 B% W$ z9 j8 y3 s# e" fCyrix 的CPU 将返回:
Z- x. o+ w7 e6 h1 `, w
- x& }) T* O& J9 e9 S& ?# G/ v1 ^EBX:43797269H+ S0 f% T! M4 K" i8 h* G: d. S* B
EDX:78496E73H
; h5 M( v3 m. B5 s2 D. g0 f; h8 W3 WECX:74656164H# w: A8 r1 b* a
"CyrixInstead","Cyrix 来代替"。
8 E: o9 T M; S/ o+ e# g, p, h/ [6 Y) J
AMD 的CPU 将返回:7 q/ |7 M# p: H- B, f6 k$ }
?6 b9 p! l R8 A, R) u
EBX:41757468H# V+ L# T7 {: {: Z! x: j7 }9 f' I$ d
EDX:656E7469H( x% G/ L" }% i
ECX:63414D44H
6 Q6 h8 w1 T% B0 @"AuthenticAMD", 可信的AMD。3 g$ p7 r% d% |; ^1 s) s
) |/ ^, Y: N( q. r
在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。! N& C( p: {3 f
) F3 u; T, @* u Y9 e& N (2)CPU 到底是几86, 是否支持MMX
# K( `0 p8 M$ Q+ P1 w 先让EAX=1,再调用CPUID
9 c$ C7 h( e! T2 @! ~ EAX的8到11位就表明是几86 % t- I8 S! G, j" z+ w! R
/ ~/ T# X7 K( B3 - 386
) r$ @+ T1 M$ z9 f* i' T4 - i486# L- x6 p* B& S3 V5 ~' k
5 - Pentium# M. b7 _2 z x+ \1 d" s1 [
6 - Pentium Pro Pentium II
2 k! Z u9 U, d! U2 - Dual Processors
' t+ J8 o4 w9 s0 g7 y8 T8 D; V" Z; F5 E4 g
EDX 的第0位:有无FPU
+ k( \) ^& J K. V
8 H# x& p: `* h EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
* {* J1 v& K4 ~& r' e
% o" M4 _# T0 r/ O) E) O (3) 专门检测是否P6架构
9 O* r% t6 [* P9 P' n! X5 l# M 先让EAX=1,再调用CPUID 1 C# g4 v* K1 p& L. I+ S
如果AL=1,就是Pentium Pro 或Pentium II
' h+ l4 W* \# L. t j (4) 专门检测AMD的CPU信息 $ `- l. b8 j" N% X4 u# a, }
先让EAX=80000001H,再调用CPUID
! _; f2 D6 G: a. c; q# z$ U; G4 r 如果EAX=51H, 是AMD K5 ) K' A" E/ z+ }0 I8 L: ~
如 果EAX=66H, 是K6 $ k$ i* f" N) H' j1 ~/ g
EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) $ y6 G5 @6 @ S3 E; @" F+ W2 o
EDX 第23 位,CPU是否支持MMX,
4 d; v$ f! |- H( s' R/ ]: p7 i5 W# `$ \. ?( v; @4 B
程序如下:
0 R; V' L! R* X1 \* z: ]. B, {# B `- B5 _
//------CPUID Instruction Demo Program------------
3 C, x" }9 b* h- H#include W {* Q4 j# o
#include 7 P3 f) {( [2 v+ ^
#pragma hdrstop9 b& a: l4 B: h" N" f! M
//------------------------------------------------+ F" A4 i8 W* z8 w& Z
#pragma inline7 j: ^) ^& A& x9 W1 T- K* Q# v/ O
#pragma argsused5 H( G- \' L: @4 O) U2 m
int main(int argc, char **argv)
8 `( `) h4 v4 L/ y6 h0 a+ Z% q' X{' U; X! P$ ?8 d6 B3 g, ?
char OEMString[13];
) {# y: Y x$ O! x5 e/ Kint iEAXValue,iEBXValue,iECXValue,iEDXValue;
: U" H$ d/ H- B4 e_asm {
0 j* l& Q {# Zmov eax,0 j2 l8 s6 N6 Y: b, h
cpuid
; F7 B5 n# ]$ g, l" F$ M Omov DWORD PTR OEMString,ebx3 | ?; E% ^, v G
mov DWORD PTR OEMString+4,edx
6 j9 A) K8 z" B" i8 S: emov DWORD PTR OEMString+8,ecx
% [! k3 L" I1 ~+ |1 V( @mov BYTE PTR OEMString+12,0. ? I+ a" S3 Z
}- j {9 Y0 v3 o6 j) E% z7 @
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
( Z+ n+ h) M' X" M8 M# l. P_asm {
3 g3 T- T N/ i* ]2 R5 kmov eax,1# S9 m4 v5 y9 t# r3 h/ A
cpuid& Q$ ~" q7 r1 W2 _0 @/ Q
mov iEAXValue,eax
: H7 f5 U0 S+ H# g9 z) M- zmov iEBXValue,ebx
8 ]* j' F- h, g0 { W5 {2 Ymov iECXValue,ecx" x4 _, r: E" ~6 d$ ~. b/ \# _* H. O
mov iEDXValue,edx
: v- B' r9 I+ | ]! n+ V}
3 s5 _+ a8 F; ?4 _. Uif(iEDXValue&0x800000)
( d& l- Q/ E0 R; [& n: i5 rcout < < "This is MMX CPU"< < endl;1 K3 J5 k2 Q( J4 F# q2 t
else
, F* o# \1 J- T5 R n9 |. ocout < < "None MMX Support."< < endl;
: i) a1 [4 ]( S9 ~9 n( ~# Gint iCPUFamily=(0xf00 & iEAXValue) > >8;
1 [* |5 g, W$ L% bcout < < "CPU Family is:"< < iCPUFamily< < endl;! n0 J6 h# ^4 |' g
_asm{9 _' \7 a: k9 H6 {- j, `5 [. ]
mov eax,2' o- x, x" _* n/ b K
CPUID' h$ G/ d% f, U( u. D% l
}
. [0 N, t- K; `% }0 I' \7 q/ Tif(_AL==1), Z( y k9 Y3 j. v
cout < < " entium Pro or Pentium II Found";- J3 ` F/ D! w3 M+ J
getch();+ G5 p$ r' ?6 u _$ L& J2 p
return 0;
+ y9 q. k& i5 V' O; P1 f* L* A( A7 }} |
|