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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
, t3 x8 F  U/ _6 ?9 {- P/ @
- `: D" z% v' l8 }4 {Intel 486 以上的CPU,# @1 g' M9 G# R0 B' ?
Cyrix M1 以上的CPU,
0 I1 A! c, c6 v. R" @  \AMD Am486 以上的CPU8 a1 s; u! v" V

3 i, K7 ^: d3 L* P6 L6 X: d  _  (1) 取CPU OEM 字符串, 判断CPU 厂商
& w! V# Y9 k2 `5 J! b) y2 e5 L" D  y  先让EAX=0, 再调用CPUID 3 _' \. l, u; x) a, P1 ?3 o
   Inel的CPU将返回:
( ?) h* m; l' j+ X9 R# m  l5 V3 l& }' m  l# X. t/ F$ X6 |- D
EBX:756E6547H 'Genu'
+ v  \# ^' z1 eEDX:49656E69H 'ineI'4 q. h# I" T6 [: m$ `, O; U  g
ECX:6C65746EH 'ntel'
# n! g1 w8 s0 v0 G! oEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
- U- C2 C& }% O2 g' L: c" _) i) I# C# ]1 I: }
Cyrix 的CPU 将返回:# t; B4 a7 c' |+ a; s1 m. X2 `
3 b# H6 [: s* h8 }' @
EBX:43797269H; J- D3 g& l  v# S1 X
EDX:78496E73H/ P9 c) Q$ S! L8 L; t. @. n( Z8 i
ECX:74656164H
/ s% T; p# h+ n  [7 y: ?! N"CyrixInstead","Cyrix 来代替"。) g5 U  P. W% O) v

( V# W3 f) \! L, X/ VAMD 的CPU 将返回:5 X- Y2 R$ s- d9 m) B2 M2 i
5 }; S$ W- X0 v  h6 V9 e% P
EBX:41757468H
7 M- {; V8 A& f1 xEDX:656E7469H! \4 z- ]/ U& J4 m1 q$ E
ECX:63414D44H
& u, J5 R1 p4 Z" d5 r; T; D; i"AuthenticAMD", 可信的AMD。
. ^  O8 O' A- I0 [0 z! a, x
7 l8 E& B9 t3 W5 Z/ B" w; C  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。# I* q4 }* y4 b& y3 J
% B0 Z8 p9 d8 D* D$ ]
  (2)CPU 到底是几86, 是否支持MMX
% T. n* a- k% |4 r& q; z$ s  G  先让EAX=1,再调用CPUID " x, \' a$ \! w! V& \! i) i$ x# t' S
  EAX的8到11位就表明是几86 " S% N7 O/ x, L6 H

8 c% u8 g4 @7 d# o3 - 386
! M1 I* r4 F/ b7 G4 w4 - i4867 X* Y2 p2 N$ n6 h) j9 x
5 - Pentium2 N1 F! ?9 {: n* }& X& o
6 - Pentium Pro Pentium II
0 K+ @. `+ V; ]& k: c2 V2 - Dual Processors7 D' b8 X/ d, P$ u% u- h5 w

$ j. Y# P' L( x: W3 ~( S  EDX 的第0位:有无FPU4 s: o- Q# D0 G& C0 j! d

7 {, d% D7 t+ V' @" ?  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 * M7 S5 }; D8 E0 e9 Q# _1 I

4 Q/ T0 J( O! y4 x+ |" M( ]  (3) 专门检测是否P6架构
, z7 b; e8 p; N% s4 B  先让EAX=1,再调用CPUID
8 H* {* i: c" R; {' f& P3 M  如果AL=1,就是Pentium Pro 或Pentium II # O) z2 s& L+ f4 {/ s$ Y' i
  (4) 专门检测AMD的CPU信息 ) H9 H; n; p; b3 @
  先让EAX=80000001H,再调用CPUID 7 B) K: P: T" r+ O! |  }( f, d
  如果EAX=51H, 是AMD K5 , b1 ~4 `1 m  U- p$ l) I
  如 果EAX=66H, 是K6
* `* c9 U& j* o) M: i% p; k; J: G  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)   n, c- e/ R8 N6 k
  EDX 第23 位,CPU是否支持MMX, 5 I% I. p$ A5 l8 E) i0 P2 u3 {/ I

! W; s; r4 q6 o4 i# O, g2 b  {2 C; n  程序如下:
3 v7 U9 \% h: s6 [/ z- s9 A) s* M7 q" b. b
//------CPUID Instruction Demo Program------------
- t0 W9 k" f) ]' m+ p#include - _) B0 K, D$ c2 L: k$ z/ P. V
#include
- v% L# i: p7 H7 D) Z#pragma hdrstop
7 L& G; m1 U( r, _* y& y+ w( I//------------------------------------------------' K4 }8 G! Y6 }; b
#pragma inline. a4 x% h0 x9 v# [. U
#pragma argsused
1 z# G) q# U( d: G$ P+ rint main(int argc, char **argv)
) D$ O& u. N& Q6 h{* }; T0 @7 i( o* i, x3 o9 o
char OEMString[13];
% ?" `0 X+ o) }7 j  s, d# X5 ]0 Q: gint iEAXValue,iEBXValue,iECXValue,iEDXValue;' L$ Z2 Y" E  d) f/ |/ K
_asm {
( p" l2 E+ R2 S9 T" Omov eax,0$ X& s* l' y% P% V/ ]$ C
cpuid
7 H8 G7 V  T) G/ T$ ymov DWORD PTR OEMString,ebx; d- I: e* z& n+ g- t
mov DWORD PTR OEMString+4,edx! s) m6 z1 ^9 U: @$ {2 z! L: G
mov DWORD PTR OEMString+8,ecx
0 U' b9 @: L  Q! R  e4 M" m5 Emov BYTE PTR OEMString+12,07 s1 L1 }) b+ U
}
5 o5 D/ X+ o/ S- vcout< < "This CPU 's OEM String is:"< < OEMString< < endl;! O# w2 I) L8 D0 l4 E) e3 W
_asm {6 Z/ h/ r: ^0 n  m1 g1 n' \# j
mov eax,1( J9 m! @: d: R3 i3 n0 X/ z
cpuid+ y* R3 P  n4 {# m9 m& Q! \7 x* L
mov iEAXValue,eax, D' h- A2 y" T% w' H# v
mov iEBXValue,ebx# g5 o) r1 S/ I2 g) v
mov iECXValue,ecx! E) ]. j/ i! F
mov iEDXValue,edx: ^1 J5 `6 h" z3 B+ r: b
}
4 o1 Y; H2 u9 a) ~6 Mif(iEDXValue&0x800000)
: t4 Q2 \: \6 V3 Rcout < < "This is MMX CPU"< < endl;6 s  _/ k" ?% [, B0 X8 ^. B8 N! w
else% G) f5 \8 R# I+ c# y
cout < < "None MMX Support."< < endl;
6 c, o/ M1 q; dint iCPUFamily=(0xf00 & iEAXValue) > >8;
4 Z1 t! D* O4 X0 G/ ecout < < "CPU Family is:"< < iCPUFamily< < endl;
) A1 T( i2 C' w" W( p: q  {: b( o_asm{
+ d2 ~6 X( i; f* s& H1 c' Zmov eax,29 b  U! S  i/ ^" F
CPUID* {: @+ W7 N2 q. n7 F5 T
}
: V/ o1 X( a' r' E( mif(_AL==1)1 X. E  W( |( E' |% |+ d9 l
cout < < &quotentium Pro or Pentium II Found";& u4 @9 g) ?5 D
getch();
; ^; q, m3 L  q( Z7 oreturn 0;2 z, S& V+ N$ J$ a1 o( \
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:55 , Processed in 0.017261 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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