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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:$ \0 ]' N- b& v
% M: t% u! n7 Q
Intel 486 以上的CPU,
  @0 v+ S* c0 [( a- m4 B0 [" K' `Cyrix M1 以上的CPU,
- O. H0 d8 f4 k4 h% Y* rAMD Am486 以上的CPU+ W: o( R$ r: W
) l) J# P; J: q6 V; S8 Y# r  o6 y
  (1) 取CPU OEM 字符串, 判断CPU 厂商 , I  x: t# e! V: i
  先让EAX=0, 再调用CPUID   s5 X9 ~' {1 Y$ Y. K
   Inel的CPU将返回: # p9 B. ~  S, g; ?+ q2 L. d

+ H* y2 {6 w; e+ \EBX:756E6547H 'Genu'- m8 O* s9 |& J  i
EDX:49656E69H 'ineI'
4 b/ ^6 w, y5 }1 M$ tECX:6C65746EH 'ntel'
0 h' F+ o" n* ]3 g+ `) `: SEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
9 W) L# {" k% D3 ?# o
$ ]5 t/ ]8 |+ W/ [7 z2 xCyrix 的CPU 将返回:
% S7 B, B! e4 S1 F! B6 e. `2 q* K( k  ?  I  @( u
EBX:43797269H) w* X& T1 B( ]' }
EDX:78496E73H3 w. a% N7 x7 Q( R& L
ECX:74656164H
8 i, _! L* t% e$ c" R"CyrixInstead","Cyrix 来代替"。: ^0 q6 m4 a) m# S

  z. j8 I% ^2 z" H& h# h; cAMD 的CPU 将返回:2 ^# r+ \( f' t) N8 ^$ n, k( d
' l1 f9 j6 \! k3 g6 r- z
EBX:41757468H
3 z6 l  C" F; j/ y1 XEDX:656E7469H; c# {' G1 f$ X$ Q9 M0 Y
ECX:63414D44H5 ^5 X) }: U  U( D
"AuthenticAMD", 可信的AMD。, T2 y% {$ Y( m, }: n
1 l7 {: q4 G& \$ Y  Y: G$ g$ X
  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
0 X6 F: p1 p7 u: D1 b  R& D) d0 m& a9 K; A9 A) A% p4 E
  (2)CPU 到底是几86, 是否支持MMX
( B6 Y! Y1 J+ ^' L7 |5 d8 F3 A! ?( M  先让EAX=1,再调用CPUID
$ S& i5 D, m( P7 m9 ?4 t  EAX的8到11位就表明是几86
1 d& ]0 J4 U: R0 J, ~# O4 j8 Z8 ?2 y: I' r  t' ?0 c
3 - 386* E4 }  Z- h% q) J5 j) y$ B- a
4 - i486
4 K1 \8 \) u7 B; ?, e6 L5 Y/ R5 - Pentium
! f# r3 e3 V' f7 ?6 - Pentium Pro Pentium II' T# x% i# a- R$ J1 `' o
2 - Dual Processors2 O1 T( x4 c. z

' E, Z, I& `- {1 T  EDX 的第0位:有无FPU0 E7 g1 ~& C4 p

8 a+ ]% E6 r1 F0 r5 k  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
4 z  ^7 S- P9 T) S- I: {& `' j8 t  V! I' Z6 d" |' v, c& Z
  (3) 专门检测是否P6架构
) h( A1 t# F2 o. Y/ p$ _% D  先让EAX=1,再调用CPUID . g0 _- }4 R6 N! b. M6 @
  如果AL=1,就是Pentium Pro 或Pentium II - N2 N, f& A: O) e
  (4) 专门检测AMD的CPU信息 7 B8 a% H! r* g/ d/ s- E# y+ R1 V$ b, Z
  先让EAX=80000001H,再调用CPUID
% g# Y) c" x4 O3 S) N1 `" K  如果EAX=51H, 是AMD K5 ( Y: T: f: Y3 R: [/ r
  如 果EAX=66H, 是K6 5 r$ @- Y8 X7 w) N) v4 _/ l6 c
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)
" @) s' O) ?+ t3 _! e' G0 ?4 [  EDX 第23 位,CPU是否支持MMX,
- l/ V2 B8 P- P! A! W% Q- `+ I3 S/ ^. c8 S. e
  程序如下:
3 o! i- ^  B8 {) P
/ v" C8 c. [6 x3 X  i: |) w! f- Q7 L//------CPUID Instruction Demo Program------------3 C$ Q' Z- i' c5 v! J# a+ m
#include
7 p( V0 }6 _7 u#include 0 G6 M$ r1 Q' M$ i8 j) K9 z
#pragma hdrstop
1 ~* U+ _( p3 S$ m1 `//------------------------------------------------
( h0 M9 b8 v8 X- u$ W% j#pragma inline
5 u4 Z& ~8 w/ o+ f; I#pragma argsused  g3 c0 B5 i* m6 P' e) {1 A! L7 b% _
int main(int argc, char **argv)
% v3 E& P/ I) E; k1 Z{# s: A. T% i! M, E) Z0 e# d
char OEMString[13];
" z" Z8 D6 e7 `int iEAXValue,iEBXValue,iECXValue,iEDXValue;; K' J8 A) ^/ q. [, a
_asm {& k' ~' k  N  K' `  j, p( l
mov eax,0! \1 ~! n0 ^* {/ l9 n
cpuid& ^+ I6 Q+ g) W7 J* V# w
mov DWORD PTR OEMString,ebx
; x, z# _8 D3 Y; c8 L% H: fmov DWORD PTR OEMString+4,edx' q: C" @" o; y' p
mov DWORD PTR OEMString+8,ecx- U2 G8 U) c: v0 {0 n: I- l
mov BYTE PTR OEMString+12,0. @* T# A* D4 s" c( @
}
- ^- ?7 ?3 u$ g% L: q" C2 Gcout< < "This CPU 's OEM String is:"< < OEMString< < endl;* p" |- y3 L$ \) Z4 {
_asm {
4 D( g0 Y/ m% a8 V- V2 T" s8 Emov eax,1# K/ O- G" I3 P) i
cpuid
1 [# ]7 n# `8 J# Omov iEAXValue,eax; D( h2 K( y8 {  V' t8 N" b8 n
mov iEBXValue,ebx
7 E- P0 h) G- k% R1 q  x1 Nmov iECXValue,ecx& C, f5 d. g) G
mov iEDXValue,edx$ }' v6 |- w0 r  n, m  k
}
* \! H7 G( a! U0 z" R! U: zif(iEDXValue&0x800000)" f  V9 w0 V" j) x/ x* ]
cout < < "This is MMX CPU"< < endl;* O+ |* L  a" M" B$ V  R: C
else  e) C, x+ o( F
cout < < "None MMX Support."< < endl;/ F$ {5 F( d8 @8 w6 c. u
int iCPUFamily=(0xf00 & iEAXValue) > >8;
; A5 W- ?4 c# r8 D0 Q; ?: `. ?cout < < "CPU Family is:"< < iCPUFamily< < endl;$ K5 a$ g7 n. w* x$ C' {
_asm{
5 q$ Y7 `- E( P0 r+ b0 }; Kmov eax,2
) T8 L+ V1 k# S+ o5 E5 r8 }( hCPUID$ Z* ^) [% ]! V7 R
}1 s4 v( p$ H: N. Z2 ^
if(_AL==1)
4 p0 r- T' i9 {" t5 P# Dcout < < &quotentium Pro or Pentium II Found";
& z4 e% O" M# U* |( c  tgetch();
& Y, ^' F# q  ~return 0;
# j% g( j5 X. {$ t) c& @3 P% a}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 08:22 , Processed in 0.016527 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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