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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
! q# q1 r$ g1 b: |+ O- a* V3 c
, d3 \4 W( a2 D% U. M2 }Intel 486 以上的CPU,: _) o& P" t- A
Cyrix M1 以上的CPU,; z! {, L$ P4 T3 f
AMD Am486 以上的CPU* d5 Z. W  N. |+ q+ K( @
3 G6 J' n1 }& u7 D
  (1) 取CPU OEM 字符串, 判断CPU 厂商
$ f  y8 j% c4 P" Z: F2 H  先让EAX=0, 再调用CPUID
: f! a3 u' B  a- k, s   Inel的CPU将返回:
. {7 U2 o, R! s7 @& t& i& E4 R& R4 e4 _% L4 K, [% y
EBX:756E6547H 'Genu'0 ^# o5 c% ^- Y
EDX:49656E69H 'ineI'# ~4 q7 h0 f2 o  u
ECX:6C65746EH 'ntel'
9 {; u* D- R8 M, j( i/ tEBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
% Q" T7 Q, c) N; N; k  r2 B! I' G1 I8 P& G6 U! l
Cyrix 的CPU 将返回:/ A9 [; U. v' {+ F8 x4 o( D
  R8 _' ~5 F+ A: A
EBX:43797269H/ h% g$ v  {9 Q9 F
EDX:78496E73H
+ [( k% t3 \  W1 m2 oECX:74656164H0 b, m) s& j0 F5 w
"CyrixInstead","Cyrix 来代替"。
; X& P4 Y; X. }: Y  [" c% ~/ F4 @- x$ K
AMD 的CPU 将返回:
/ W1 `6 D- S- l& K; p# ~
& d/ A7 Q7 `7 MEBX:41757468H4 e# v5 l/ Z* X7 K/ v
EDX:656E7469H
1 M8 a/ L) e8 [; Y' z/ _' i5 ]6 M+ z! ~6 aECX:63414D44H
& d8 C2 A. y$ e/ C4 H' y& T"AuthenticAMD", 可信的AMD。
# c3 [$ J1 }! `! O
7 s$ @0 W! {& D4 g' _6 ?  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
7 z1 \) k9 \+ _1 D* t$ ]  z1 d! e/ U# M6 ~4 o  z
  (2)CPU 到底是几86, 是否支持MMX # G& l% i3 A  _2 G
  先让EAX=1,再调用CPUID
; P9 W, m0 z; _8 H) y$ z  EAX的8到11位就表明是几86
/ V9 p1 M" V3 T+ _. L2 ~* I
) F" j; n. h! Q) l3 - 386+ @( V0 R, ^" G. b# |/ o; E
4 - i486
+ Y! U+ K- ^# S9 l) U5 - Pentium
3 a) b& i7 k; ]9 p: o) g" D6 - Pentium Pro Pentium II
6 y0 Y1 K' O' Z0 P7 D5 i2 - Dual Processors
, j! }' K1 d. s# A  _3 u/ q( y
( H$ k7 d9 J  L/ {  EDX 的第0位:有无FPU
( j1 v, ]  R' Y
0 Q5 ^0 |& F) v; ?2 N, g  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 * ^- n' y% [  J: f# o
1 ~) i. T% c- b# l
  (3) 专门检测是否P6架构
9 h! u! U/ l% K( p  先让EAX=1,再调用CPUID ) Q, p1 i& [. t" a, r# e* ~
  如果AL=1,就是Pentium Pro 或Pentium II
; W. G3 N  n4 z* X' ~! q, F' \4 Y  (4) 专门检测AMD的CPU信息 8 q1 L9 F. O1 r" P* Q5 \
  先让EAX=80000001H,再调用CPUID
: i& X! g* V; a2 R- t( t  如果EAX=51H, 是AMD K5
0 C9 \" a) T% ]  如 果EAX=66H, 是K6 8 l0 a+ o! k  q5 U  _& W5 O
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 5 j; m( j2 V. h' B1 v
  EDX 第23 位,CPU是否支持MMX, 1 W5 l4 x/ j' D! v5 A% A
3 ^# n8 `0 w2 [5 {9 o
  程序如下:
3 c6 z3 l/ [* r3 H0 H: V. E, d8 Y, t% J, C5 G
//------CPUID Instruction Demo Program------------
2 ^7 D' g8 m: X5 p/ [5 G' }#include
0 a* x* B6 U5 w3 O' F# K# B/ |#include
) I5 B) R& U: g% s$ I  t7 v2 v9 H#pragma hdrstop: f7 d$ Q, I; I6 n8 j1 V
//------------------------------------------------$ U+ h+ k. |& ~  d" w& M
#pragma inline  ]7 l; @3 U9 t1 I3 X# |
#pragma argsused
; r3 x5 y5 U( G! y% J) D$ Xint main(int argc, char **argv)4 J! j8 W& g$ V% w4 r
{. V* h  [4 m# D( q4 Q+ X  k
char OEMString[13];* ?5 ^+ i; Y$ h) A! e' b
int iEAXValue,iEBXValue,iECXValue,iEDXValue;
4 w/ \0 ~" r4 I4 Z% }_asm {
7 |) A9 S$ y; h3 t4 B6 F0 Fmov eax,0
9 j$ o( X4 _! _cpuid9 |7 p& D/ C1 x* [3 n* G+ b
mov DWORD PTR OEMString,ebx& \, l0 A5 D' X( p: u
mov DWORD PTR OEMString+4,edx
% g' Q7 L1 R$ J0 G. J0 Qmov DWORD PTR OEMString+8,ecx
( g: I" \* ^8 z3 Mmov BYTE PTR OEMString+12,00 n( ?2 w9 H8 l) y1 W
}
& I: J# ?% ?% `' Q3 E" scout< < "This CPU 's OEM String is:"< < OEMString< < endl;
4 V1 M$ E: U7 y! i_asm {0 ^* X. ?+ M% Y( K! ]# @
mov eax,1: F3 A9 g; i! N6 A( a9 d
cpuid
) H) S* \  s' l, C! X; x: m+ x6 Amov iEAXValue,eax$ K# o) \8 A7 b8 t2 q  p7 z
mov iEBXValue,ebx
4 A) i+ S; Z! j; c- \8 l' Bmov iECXValue,ecx
3 M' J& D3 q3 q6 fmov iEDXValue,edx
! i9 z! J+ X/ {}
! f! X4 S; ~8 j6 B: dif(iEDXValue&0x800000)9 J+ j& p5 W& F; S8 Z" V, h
cout < < "This is MMX CPU"< < endl;
( {$ Y7 X& t0 @2 K& p9 Welse1 T  e+ F! O- f: w% d$ N% U
cout < < "None MMX Support."< < endl;
; o6 G) c7 l4 X6 F# X/ N5 b8 Sint iCPUFamily=(0xf00 & iEAXValue) > >8;  R" M  p: |3 A2 _" X5 C# ]
cout < < "CPU Family is:"< < iCPUFamily< < endl;7 e1 l' h5 ~0 z4 Y- H
_asm{) w( w4 ^# a3 [
mov eax,2
* r. T8 Q6 O3 D$ [  ^5 zCPUID$ g7 X4 X3 L( n0 K% E: `
}
, @- m) z- V+ k( K; _% S. A# [if(_AL==1)
+ c* C# i8 z: a0 G+ g: kcout < < &quotentium Pro or Pentium II Found";: x( t2 q2 p# S2 z7 |6 D
getch();
6 n# o" |9 O2 S' g. R$ z$ _return 0;
: i1 Z5 v- E! u( S; u8 g}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 06:50 , Processed in 0.019842 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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