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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:. l) o2 ^; D7 E& ]
2 O  R9 ]. A6 r' \
Intel 486 以上的CPU,% \& |- }# W, `' r( }& C7 V
Cyrix M1 以上的CPU,
4 o, t* c$ w9 ]. R5 {! GAMD Am486 以上的CPU1 V. G  V0 V( T+ t/ C

" t0 X  g1 V- [  (1) 取CPU OEM 字符串, 判断CPU 厂商 7 j  v: h7 H  _' `3 B3 g6 ?
  先让EAX=0, 再调用CPUID
& t* o7 L" K- ~! V' m6 D  `   Inel的CPU将返回: ( t" i* A/ l) X; j6 y
. ~# ^+ v( F: _9 n; e
EBX:756E6547H 'Genu'8 h3 k1 {4 u2 D
EDX:49656E69H 'ineI'
; o8 I, H0 s4 D. [2 j; cECX:6C65746EH 'ntel'& M2 @7 N/ i* `; {- d
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。4 h* w3 ?% B4 j* ?* f- A  @7 W$ }

" n  c5 f9 M* N9 c- n; ~Cyrix 的CPU 将返回:+ M* q& [6 n7 l; W* m- A

9 N$ _$ X. y8 x3 A. q+ \EBX:43797269H, m- v3 _  D% X  B4 n
EDX:78496E73H
, P0 C* H1 |1 g; j$ U+ `4 [) _' ^ECX:74656164H
1 l/ W; P7 F8 r/ y  J# @1 `2 U7 u"CyrixInstead","Cyrix 来代替"。
/ r% _3 x2 e. s1 ?% @1 \2 G
* p6 }5 m8 t) B" V" p- o, R! O9 ]AMD 的CPU 将返回:
/ b( f7 c: t: v! ]  R. A! _2 k! s' P. `! B4 V. ^& {: l
EBX:41757468H
# j" j0 O, W# [EDX:656E7469H* d" f5 C. z+ O# i
ECX:63414D44H
! [- g& j- l4 ~+ p  a"AuthenticAMD", 可信的AMD。
& D/ p6 y2 @. H9 E! G
% L  ?( M5 ~9 z4 J8 e" Q8 J  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。- B' F) w: Y: R0 M% b' Z) g7 w5 {

  w2 ~/ P" ]( m4 S- k7 ~  c  (2)CPU 到底是几86, 是否支持MMX ! x1 j  N/ q3 V) \8 f, j. }$ ?) E+ D
  先让EAX=1,再调用CPUID
& H2 @+ u2 @! P* v+ F  \  EAX的8到11位就表明是几86 : w$ Q9 W+ Z6 u/ v. s1 w+ {  l
) _2 d  d. x) O
3 - 386
$ u" e3 B7 K; }4 - i486
7 J! c8 U* `3 N! N# J. c( W" W5 - Pentium6 J, ], X* }1 c' b$ l
6 - Pentium Pro Pentium II
$ W0 o  U5 i, o: j6 l) S2 - Dual Processors( \% L8 L. X$ z  l. \
' b- P, r- s2 l2 `7 ^' x
  EDX 的第0位:有无FPU
* j5 e* ~1 j( Q9 B& |; q2 g6 }' R% p% ]+ E* V$ Q- X$ W! B; ?
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
7 H2 X2 Q! z" f# i5 t
6 z) }  S1 t. B  (3) 专门检测是否P6架构
- A1 j9 u. _- J6 p5 g/ \7 ^  先让EAX=1,再调用CPUID
/ L' P( X) \) W+ B) \7 |" I: W  如果AL=1,就是Pentium Pro 或Pentium II
8 ~: q, ]3 q3 v2 I8 B, p$ y# z  (4) 专门检测AMD的CPU信息
: {/ \) J! U6 c  先让EAX=80000001H,再调用CPUID 7 N; ~; M5 L1 k7 j* V4 S+ B
  如果EAX=51H, 是AMD K5
$ [4 }! V( I; J8 ^  如 果EAX=66H, 是K6
1 ?0 G# e3 h+ `6 w. K  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
: h  E% w- J5 g0 s' _1 K* w  EDX 第23 位,CPU是否支持MMX,
( z  t6 g2 Q2 e+ M0 e$ V8 c' F3 U/ F! ?5 Z
  程序如下:
7 w+ U: y+ x1 {6 d9 Q: i! L4 f$ o3 V1 [% t* C6 S
//------CPUID Instruction Demo Program------------
; d4 w0 D) {0 d#include
9 C# ~9 @4 V6 `1 @7 T#include
% J. N* f% B! V/ G7 H7 g#pragma hdrstop" {3 s: i  o; A: }. I; l  S
//------------------------------------------------8 }% K3 Z3 z* G9 w* n5 s: o
#pragma inline( _9 s! J: v4 S- B% M% u$ v
#pragma argsused$ x+ N1 ]* n" f& K& p( l& ?
int main(int argc, char **argv)
4 `: _3 q- m, G8 j: K0 j# q{
3 a3 J; a5 b7 F, echar OEMString[13];2 H$ b0 L: P, x7 g7 [* y: X
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
# P* y& [4 |# j1 U/ X* Z  n_asm {: a3 K5 f& v3 ~" V3 D
mov eax,0$ D% S5 X! ]6 j" O2 ]6 y! |3 e5 l
cpuid
5 |/ n8 b* X' pmov DWORD PTR OEMString,ebx: X9 e' a& K8 n1 F& A" K6 j# v' d
mov DWORD PTR OEMString+4,edx9 H$ E3 b5 n) O# `( E* \
mov DWORD PTR OEMString+8,ecx  ]( P  b( E/ S. H
mov BYTE PTR OEMString+12,0  B$ W9 P* B* E$ E1 N
}
& t1 R/ Z: M( m! }  K5 ~. lcout< < "This CPU 's OEM String is:"< < OEMString< < endl;$ |  C2 ~+ N/ K* I( E& i4 q2 F
_asm {
9 g: j) \( ]3 lmov eax,1" A" J+ J; H. x& h$ e- i( Y+ U
cpuid5 s! c+ F# Q1 j: S0 _
mov iEAXValue,eax
& o0 s. g+ C0 @* i8 f# Kmov iEBXValue,ebx) F* W- {0 w! _8 ]; p
mov iECXValue,ecx
( ~) t: H# W3 _, P2 Tmov iEDXValue,edx6 U$ F1 j3 v& z9 t8 v: t2 V
}/ \! e: r( t2 M3 O9 l
if(iEDXValue&0x800000)
1 ?4 O) M) `( B% ecout < < "This is MMX CPU"< < endl;
+ t' [% R% y* o2 g' Telse+ Z( ]4 ^; x1 O$ l, ?( }" n9 N
cout < < "None MMX Support."< < endl;6 _/ G! D; j6 ]! M" D5 }
int iCPUFamily=(0xf00 & iEAXValue) > >8;) I$ ?+ q. `; I3 y1 S
cout < < "CPU Family is:"< < iCPUFamily< < endl;- ?; U$ a+ r, f3 Z4 u4 s
_asm{
3 r+ D7 {; L- C3 ymov eax,24 e2 R3 _4 [; O
CPUID4 V4 l) X" n4 T, q' p
}
1 d, F, L2 M9 q, O$ ~: C  Dif(_AL==1)
) x; U( ^) C$ A8 X0 f; x( jcout < < &quotentium Pro or Pentium II Found";: q2 s+ H$ A" g+ q& I
getch();: }& Q+ N$ z1 e* s- R$ m3 D/ e9 _
return 0;5 ~! ~" W& D4 N: a. W, @
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 23:42 , Processed in 0.018713 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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