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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:  W5 E& S- t* k7 c" {
' ~. M1 X/ E) V+ |1 U3 _
Intel 486 以上的CPU,
' z8 f% p( N# J' d* b0 _7 ?, ^Cyrix M1 以上的CPU,) Z+ `- X; w: F
AMD Am486 以上的CPU
2 J; c& t& K$ F( \0 l4 ]! q- Z9 w  p: K7 F/ \- I8 P
  (1) 取CPU OEM 字符串, 判断CPU 厂商 . F0 q; M$ t! a' f; a
  先让EAX=0, 再调用CPUID 5 v$ ~3 H9 M* k  o5 H
   Inel的CPU将返回: * d3 L( F! F6 V: U2 [% M8 g% V

" e3 X# R" z# v- Q( {EBX:756E6547H 'Genu'; e+ m: `4 J; j- [" @3 S
EDX:49656E69H 'ineI'7 j' ~+ f+ g: g) J+ ?. ^
ECX:6C65746EH 'ntel'
+ P! A( `$ Y6 p8 T2 W# [$ dEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
' T6 Z. o$ C* i9 _, j* N+ J2 n7 r5 g" h  b$ x1 u9 H
Cyrix 的CPU 将返回:& @5 v% x; X/ e" ]

1 [  J( o) R2 j& P( u$ V; |' rEBX:43797269H6 G" j/ {/ ^& P
EDX:78496E73H5 j7 B( ?. F% F* u9 u; E
ECX:74656164H7 Q; C- x( K- U: W0 ~5 k7 @: }- u
"CyrixInstead","Cyrix 来代替"。9 ]( T; V; e! B' g" P4 V
) X$ q0 V2 V0 t
AMD 的CPU 将返回:# m0 C9 G6 W1 X; x

1 ^: q* }1 X3 Y$ l4 J( fEBX:41757468H
  N$ V( ]* K( Q2 }EDX:656E7469H9 J. ?8 O6 D$ q) ~
ECX:63414D44H
1 P6 J# r# ^$ c. o- L8 `& Z6 Z3 c$ G"AuthenticAMD", 可信的AMD。
9 s' M" m+ y% d6 f' m# b7 p( t! C5 C- m0 N2 y0 z8 M$ Q. Q/ V! ^
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。/ Y* {1 E$ |# U' {) D6 S
0 g' [2 e$ j$ m
  (2)CPU 到底是几86, 是否支持MMX
8 I# H7 o6 [  I! U  先让EAX=1,再调用CPUID * M) d7 \/ e4 H/ ^$ O/ a  W
  EAX的8到11位就表明是几86 % M! }, A- M+ [: q* Z% Q. v
$ i5 K! w' x1 ]# l& Y4 M# S
3 - 386# x2 F* c) M4 M5 i6 y; U3 @
4 - i486% J% K4 ]0 {' U# ~, c
5 - Pentium& G: O5 [. X% R
6 - Pentium Pro Pentium II0 S/ M6 _& F) F/ N' J8 z( h9 S
2 - Dual Processors
/ A1 A" a/ }, l& ]' [# L: a6 p2 F+ @' u2 v' T( n
  EDX 的第0位:有无FPU
# O. g. g' R2 k  W& h* \0 ~7 G3 J9 y+ q, m
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 3 @7 c# \3 a% H7 t) ?: t: q

% ]/ q- l3 Q# h& l2 F& c  (3) 专门检测是否P6架构* D1 B; q8 e: ~; V, L
  先让EAX=1,再调用CPUID , e& N* o/ X9 {1 K8 d
  如果AL=1,就是Pentium Pro 或Pentium II % j! O! e, M2 S0 ^) }5 A
  (4) 专门检测AMD的CPU信息
5 S2 L5 c7 y6 X' T' _7 u: e  先让EAX=80000001H,再调用CPUID
+ S( h3 U" \. g1 l  如果EAX=51H, 是AMD K5
( E" z1 w+ u: {$ k# z" u- H1 Q% X0 e  如 果EAX=66H, 是K6
) `3 Q6 \1 e; {) H0 T  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 8 B% ~' D. i: Y; E- K/ M
  EDX 第23 位,CPU是否支持MMX, 2 C# o9 o! L4 y9 ~; m
+ V. }( c  ^( W) }7 v
  程序如下:; r7 m# b/ U, i, r

& H9 p. `' [7 u6 e& t3 K: Z//------CPUID Instruction Demo Program------------
2 {) m2 H: `- V#include * f* o1 a7 s* ]9 a; x7 b3 U+ t# r
#include ! K0 H9 X- F/ o% n/ D! l; {# c
#pragma hdrstop! C4 @- S5 ~" h* n
//------------------------------------------------0 p* u5 E. ^, L# f- x: H9 Z. P. q
#pragma inline& w; v( e, [& i6 `6 o# ~
#pragma argsused0 M7 @) L7 I8 C4 H
int main(int argc, char **argv)
& o, v$ v( K, n7 F! S{4 t( m6 @( T* ^3 g' E! T0 f
char OEMString[13];
0 W. l! h& I( X  P2 F. Iint iEAXValue,iEBXValue,iECXValue,iEDXValue;6 a" H- |. I& \0 l# z
_asm {: ~: Z& T% v( z  ^9 h; C; U
mov eax,0
' b( p; y5 Z) j: G% P" b; H% Rcpuid! S; j) p+ u" N) N
mov DWORD PTR OEMString,ebx
3 N1 R/ F) m. e# Smov DWORD PTR OEMString+4,edx9 }3 u0 w, \$ i) F3 w- \$ U7 p& t- t, O8 M
mov DWORD PTR OEMString+8,ecx3 Q1 V) S& l# }1 [/ M0 |8 B% d; L
mov BYTE PTR OEMString+12,0% f1 Q- h9 D2 Q8 N
}3 P2 B6 J+ O8 s* [4 ^" g) {- G
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;1 b! @& _9 e6 C! X* F. U
_asm {0 g, q4 X& K2 {9 y% n7 H
mov eax,1
4 J  c8 d8 Y6 L* o! f  Vcpuid' H  P6 x3 V4 d8 {: G6 T1 E+ ~9 h+ s
mov iEAXValue,eax
5 H: x3 [" S4 z$ _8 H( {7 qmov iEBXValue,ebx7 r' d5 _8 q4 X' b
mov iECXValue,ecx" }# Q! }( u0 S" o) s1 e4 q
mov iEDXValue,edx: n' N& ?/ ^$ C
}  w- N3 |( Q/ [" I3 L# G5 A  R, V
if(iEDXValue&0x800000)
% A& ^/ x: p; x+ k! `" h, l9 m* \  Dcout < < "This is MMX CPU"< < endl;
  p! b3 t0 D, O% k, s/ p! [else/ H6 h% W* c: o9 U5 D4 E
cout < < "None MMX Support."< < endl;) `2 U% p/ y' b
int iCPUFamily=(0xf00 & iEAXValue) > >8;
% H6 i: j+ f2 w4 e% l+ M, b: Kcout < < "CPU Family is:"< < iCPUFamily< < endl;
7 D$ A" W7 O) W& \& G; o_asm{  P0 |  ^. m: M' h3 [6 f7 Y2 Q  l
mov eax,20 l9 a6 |' y7 ~. k! I1 z. a
CPUID
4 z1 D2 H; |4 G# t# }3 S4 r}
5 u: [( [# O5 c2 K/ f+ qif(_AL==1)6 p/ W+ X- o  T* \* e
cout < < &quotentium Pro or Pentium II Found";+ J$ M3 `6 J% D$ \7 {: `
getch();
  w5 x) M# _7 [return 0;
% \5 t0 n0 m) n5 s0 j9 y3 W}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 04:45 , Processed in 0.014989 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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