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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:! k9 X" i% `7 n. E+ V
  H6 g) t0 b( F1 `2 O: V
Intel 486 以上的CPU,
& v4 n: n4 p% G8 h% K+ B& ~4 uCyrix M1 以上的CPU,* P7 ^$ D  B$ Y: Q: v: R& s! k
AMD Am486 以上的CPU
3 T' I1 J; {2 p2 K2 C+ i" T* D3 }* a* i/ j1 w: ^
  (1) 取CPU OEM 字符串, 判断CPU 厂商
, w2 \5 b/ N% W) |' w, V! K( ]  先让EAX=0, 再调用CPUID 0 B# s* D* b/ x/ d9 \
   Inel的CPU将返回:
+ u1 r& P7 e, l$ d9 v
0 _9 `! {0 K; t! K% @: A: EEBX:756E6547H 'Genu'
$ e/ ]- p. w: v5 e: t0 f/ mEDX:49656E69H 'ineI'
+ Q- d( D$ B2 O" zECX:6C65746EH 'ntel'$ c2 ~+ K( y7 m/ g9 O$ s8 j
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
. I' K+ F  o7 j3 P7 a# F" G% }0 M' b! b& R. n
Cyrix 的CPU 将返回:
  U0 _; O3 N8 Z
& W$ k3 O& o& `EBX:43797269H
2 e' u$ @6 S' K( b5 o, u4 UEDX:78496E73H
+ T& `1 m7 t; D% ~* g/ u( P' [8 W$ Q) N# vECX:74656164H
5 k- u; ?  L* u"CyrixInstead","Cyrix 来代替"。7 n. C0 K4 B  \
0 c# X4 `" p( b0 L5 G6 ^
AMD 的CPU 将返回:
( s+ U. N7 z9 y. e8 n5 X1 z/ t2 J& w+ n7 q9 g; }# C, I" i; x
EBX:41757468H6 M5 f/ I. P( x) O9 a
EDX:656E7469H- q& |: P4 |( i: F/ p% B" g, i
ECX:63414D44H+ z7 T, e$ c& l
"AuthenticAMD", 可信的AMD。
+ l5 f( v; A. X* j( m; k
3 @* I* H+ }  _* T1 v- M9 w* ]  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
) Q$ X5 o9 X* z# t; A
* C+ ^0 x8 A3 A9 C/ y  (2)CPU 到底是几86, 是否支持MMX
( Y5 _8 ?$ I% ?# t! `  先让EAX=1,再调用CPUID 1 t$ s! o% Z& }3 ]9 l
  EAX的8到11位就表明是几86 ! f! k) N) ^3 M
/ W- d* O2 ^) {* V( Q. I% `
3 - 386& k! k: H$ a) i; ?) Y) X' P3 m
4 - i486% x+ g$ r. q4 L& |/ N0 V
5 - Pentium
, m5 C7 w) t9 i+ S6 - Pentium Pro Pentium II1 Y/ w# p7 {- A/ ~- ~6 O
2 - Dual Processors
5 ^- p: Z2 G8 `, t. y: f5 o7 C: ~+ c6 k3 S) a
  EDX 的第0位:有无FPU( {, L3 H, j9 f! j" S( [7 `
: F$ c- h: j: _) Q2 r
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 " }5 V% {* ]/ f0 i$ D# A
# l" y4 e% Y, o. p, f& a) ?9 R
  (3) 专门检测是否P6架构
4 o. e4 ^, _1 f' F  先让EAX=1,再调用CPUID
; d( q/ R; f2 V4 m& l' [/ t  如果AL=1,就是Pentium Pro 或Pentium II 1 p! i# U/ n9 B1 \0 v. G
  (4) 专门检测AMD的CPU信息
& W- N6 P# s- `& m  先让EAX=80000001H,再调用CPUID
2 e- A  d  c+ [3 j+ C' L! J4 d+ I  如果EAX=51H, 是AMD K5 : w: ]  ?5 k- B
  如 果EAX=66H, 是K6
3 u$ V5 Z0 y& a  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) / U( |" B4 E" S* c2 z0 |
  EDX 第23 位,CPU是否支持MMX, & t. g# j5 i2 z  \7 q% y
5 a. h5 h% l9 j: {
  程序如下:
/ l8 K' L/ n( R) e( L+ t7 ]
4 b  ^. ]1 a6 u2 d, e( G  Y/ H0 u9 L//------CPUID Instruction Demo Program------------
. R" n6 _5 h' g3 ~#include ; l+ H3 [! p2 q: E5 X* `' V
#include
6 @  O0 P  n* L& [. T- E#pragma hdrstop
2 u( `1 o& V6 k% @: e; T//------------------------------------------------
. R6 [; e; p9 j9 T) M* }$ P/ p: F#pragma inline
0 w7 @( ], Z& t1 p7 o" @#pragma argsused3 |' X) M2 j0 O  `4 d
int main(int argc, char **argv)
, J; m+ }4 ?8 |2 s" H4 {0 i! m{' }: N5 w3 g9 ?' E  ~
char OEMString[13];8 R% k3 X  \5 n4 k" D7 o; ~4 E
int iEAXValue,iEBXValue,iECXValue,iEDXValue;' L; j- Q$ b  E9 d4 ]" {: @9 u
_asm {: D  F2 Q# ^% |! V* t9 J
mov eax,0
0 m$ g5 o- U8 I' u3 }7 D0 n% x: kcpuid& t" ^; H6 C) O) Q
mov DWORD PTR OEMString,ebx
3 z( V6 I1 H$ y& xmov DWORD PTR OEMString+4,edx( q( L- ~! ^4 o& e5 ]; J
mov DWORD PTR OEMString+8,ecx# [4 _4 z0 G0 ~, f8 `, i. }
mov BYTE PTR OEMString+12,0; P# h, j' k: F! U  H
}
1 d! v: Z& y, t+ ocout< < "This CPU 's OEM String is:"< < OEMString< < endl;# K; p. E4 J) j3 L3 a0 i
_asm {
7 V; Q$ Q' T% w1 v2 R/ E% imov eax,1' n9 D5 J) z- b( T) N0 F/ e
cpuid
: A( Q! K5 N: i! @mov iEAXValue,eax
$ H: ~) o8 Z- v& a" Q" i# imov iEBXValue,ebx
  r; W8 C* F6 r0 Tmov iECXValue,ecx. ]: \) s4 }  S* r: [
mov iEDXValue,edx
/ o1 v6 ^8 y0 g4 Z$ k7 o}6 Q7 z. D3 s9 w7 [) t
if(iEDXValue&0x800000)
  v6 W2 R& a- n. l( X( z; Dcout < < "This is MMX CPU"< < endl;
; C& o( B& u+ l, Zelse/ F" ]% u6 g1 i6 B5 ]$ \/ ?, P
cout < < "None MMX Support."< < endl;$ F, B3 E' S+ O+ ^6 N( r! l
int iCPUFamily=(0xf00 & iEAXValue) > >8;
% n: h6 K; _, H2 \; _) V0 Wcout < < "CPU Family is:"< < iCPUFamily< < endl;
# h9 p! j4 u9 {( I_asm{
9 H/ k7 X* M4 @. {5 m# Nmov eax,2: o( C' d% D  J
CPUID
0 u' ^3 |. Q7 q8 Q4 a9 h" K7 U  {}
' B% H" B$ {3 A, L) N5 yif(_AL==1)7 v2 L: q1 W1 j  O. z1 t
cout < < &quotentium Pro or Pentium II Found";
" P# n- _. O: ?getch();
$ N3 P# j$ g" B4 m5 c7 b& sreturn 0;
/ L) X1 J; W" B) e}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 09:26 , Processed in 0.014583 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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