找回密码
 注册
搜索
查看: 3942|回复: 0

[收藏]使用VC++取得CPU信息

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
# ]+ k7 _6 a: w6 h& x+ ]) e! Q" G4 H
0 e" W% r( @  ]7 L6 Y7 mIntel 486 以上的CPU,
( ]# Q) O1 D- k* i# ~, PCyrix M1 以上的CPU,+ T& w3 D3 C: m& `4 h% k
AMD Am486 以上的CPU$ j2 \9 _7 A% J

" @7 V7 u# d% W' _1 C' h7 K# ?  (1) 取CPU OEM 字符串, 判断CPU 厂商 8 w& M# x# Q; S' i1 X
  先让EAX=0, 再调用CPUID
. d* m$ R! g; E7 u0 O& y' ?  {   Inel的CPU将返回:   O% _# M- L5 {- E8 z" [

% H* x5 }1 d2 i1 J4 R/ A5 ?( E" |) fEBX:756E6547H 'Genu'
  S% O; n5 E2 e1 @6 m4 r; jEDX:49656E69H 'ineI'7 \* o: B/ @+ X2 p# N5 i1 t
ECX:6C65746EH 'ntel'$ B3 D9 b( L% h" X* S6 k" G
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
/ |  k- y/ x, R8 m  k, I7 ^4 g$ \# R, d) L( k6 E9 D
Cyrix 的CPU 将返回:
3 @  l& u  |, [$ H( l/ [, N1 h1 G  z# b% n
EBX:43797269H
) \9 j* M+ u5 Z) ~; s2 KEDX:78496E73H8 S4 b1 z  N3 [( A( T
ECX:74656164H, q6 e3 _: m. j7 i/ Q
"CyrixInstead","Cyrix 来代替"。
" J" a+ u" \' ~% X3 s8 z( c' b/ `+ M0 s
AMD 的CPU 将返回:; k5 A1 X4 p2 W3 T7 q% w

+ j, b; X0 g7 y8 ]; eEBX:41757468H1 t: b8 Q4 Z3 w1 D9 |
EDX:656E7469H- _$ |; Q$ N, J# J1 w! a3 R
ECX:63414D44H# Q2 V7 b" K/ y' X5 w, l
"AuthenticAMD", 可信的AMD。
& v1 T' _& T( n& c9 l" Y* z& Y' C8 s
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
4 ~% [/ |/ a& \* H
3 N3 y* k' P# ^+ l$ p  (2)CPU 到底是几86, 是否支持MMX 2 e% {! M% H! \
  先让EAX=1,再调用CPUID
$ ^1 v; D) `# l  EAX的8到11位就表明是几86
, z" B3 e3 l6 Z! N* F
7 B5 S. W5 h* J1 \9 V4 K3 - 386, c( {6 J% Z) `7 T$ e9 G+ x
4 - i4860 f8 i8 \$ ?" Q+ V0 D- l. t. Z
5 - Pentium; f7 P& r  q& D7 b
6 - Pentium Pro Pentium II
1 I7 t3 |5 {! q* C2 - Dual Processors+ h# c* [# @3 o

. g, |3 a- ^  L  ?4 T  EDX 的第0位:有无FPU: q1 {$ C2 V8 f/ r1 s  t( |3 }4 Q

+ X: ~& G; W7 P8 r8 c  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
$ n& }* x7 e, H% l' ]  u- ^' q$ F
  _5 k/ J$ z+ J( q0 R1 X  (3) 专门检测是否P6架构( j+ K& A$ @3 Y0 L& N
  先让EAX=1,再调用CPUID / D7 O2 W9 i8 w: e7 T
  如果AL=1,就是Pentium Pro 或Pentium II $ w& S: [& U, h: u
  (4) 专门检测AMD的CPU信息 9 A7 }6 N* O  ^, p- ?2 v) u
  先让EAX=80000001H,再调用CPUID
! T+ I9 Y$ t% u! k# y  如果EAX=51H, 是AMD K5 0 p8 v2 O6 w! P0 \
  如 果EAX=66H, 是K6 ' p, T) b3 ^4 M, {1 v
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 1 S; s% K9 {) x9 @7 c4 ~% B! g
  EDX 第23 位,CPU是否支持MMX, 0 W( K$ b1 h: t( E9 f
  ~6 ~- U7 f6 I1 K. u+ }6 d
  程序如下:
' T# h7 r; M. X9 y  K& Q; Z
$ Y0 c4 o- F9 z% W" m//------CPUID Instruction Demo Program------------
. H" f5 i5 V: J/ M3 e* P#include
1 ]; E, r: Q8 e8 O0 C2 T% a8 O#include $ h6 L) J* j" ^* G
#pragma hdrstop& K$ {/ J1 r# J7 b
//------------------------------------------------; |1 A7 e7 a) ^# n# u7 P
#pragma inline8 ^* j5 q7 S, }& s, [7 i  H
#pragma argsused
  v: `4 ?" D" v+ [4 m5 pint main(int argc, char **argv)
. @! [9 ?5 \: p+ V8 @! t{# j- f# @! z2 K
char OEMString[13];9 n& s: Z- |7 s3 W
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
9 i6 W' K6 q  \5 ^# P. S_asm {6 B; u' g2 J1 J: r' m$ m* B
mov eax,0
0 ?2 `' q) R8 U. Q% }3 _' Y! acpuid) K& S* ?1 S8 [" O/ X- ^- h0 d
mov DWORD PTR OEMString,ebx
) J. S/ c' z8 \' j/ q+ @mov DWORD PTR OEMString+4,edx6 Q8 C: g) c2 a$ S3 O
mov DWORD PTR OEMString+8,ecx
2 y: |( K( n5 H% O% q/ v, smov BYTE PTR OEMString+12,0/ M( m" _# [- j
}' a$ R) v" D5 H$ E: G0 m
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;0 [& n9 b6 N  R0 ^
_asm {
# Z( D& K6 Z* f  k4 U3 z# pmov eax,1
; ?1 f; j( r1 @6 M1 Fcpuid2 ^8 v# T3 G' p" Z( Q, H- ?/ L
mov iEAXValue,eax$ \" ^9 A" p3 B, R+ [; q# P. X
mov iEBXValue,ebx; [8 m! S' R" h- C) h
mov iECXValue,ecx
2 E* S2 {9 d9 x/ `5 omov iEDXValue,edx% S+ z4 {  @4 i/ C5 w1 b$ |
}9 z+ ]; ?- S8 e3 s
if(iEDXValue&0x800000). V# c+ Z* I' G' G4 X: d3 Q
cout < < "This is MMX CPU"< < endl;
& L7 K! Q0 p3 Z# T6 }else
2 i1 T1 i, _* j+ Q; r  x* N+ zcout < < "None MMX Support."< < endl;9 \% X/ m" Z) b8 a" i" o( l9 i
int iCPUFamily=(0xf00 & iEAXValue) > >8;
5 E: i- g8 K* }( n$ ccout < < "CPU Family is:"< < iCPUFamily< < endl;
1 ~  V3 _8 p/ N  f_asm{. d5 ?. y  F$ N8 S3 Z
mov eax,24 C7 q9 G) p7 p
CPUID6 c. a+ y3 t/ Y9 f7 ?2 D
}6 K7 o) U/ {, {4 s% p" A5 g
if(_AL==1)5 S5 y, k0 {# p* U
cout < < &quotentium Pro or Pentium II Found";8 _) T3 O+ w6 p
getch();
0 z1 [, ^6 g0 Preturn 0;$ ?/ Y( }1 j9 I  h; [2 L5 l
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-5-5 09:07 , Processed in 0.014009 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表