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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:
- i6 I" K, n! l# p. J7 i. u1 a8 q) q8 `0 Q- U8 @1 J) U% M
Intel 486 以上的CPU,+ z' F" V) \, @1 N! c
Cyrix M1 以上的CPU,- e! H: S6 k+ m. k1 U
AMD Am486 以上的CPU& H. s4 u! O8 X$ O9 X( }, b
3 k4 K$ a+ l% T4 U. C
  (1) 取CPU OEM 字符串, 判断CPU 厂商
; j5 N* o* W# U, Z, v- D# l  先让EAX=0, 再调用CPUID : [/ T" p. a3 S- S( I% ~! ]* [
   Inel的CPU将返回: " }* l) E8 g0 r
  S  c: X% A' [. m2 L& B( \
EBX:756E6547H 'Genu'% i' ~1 _5 f0 M1 b# O! e& s
EDX:49656E69H 'ineI'
* ~; I; v# M, iECX:6C65746EH 'ntel'* d! h4 D% |# ]2 T+ z4 C! C
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。" U3 p7 c( p+ U: X
$ i5 o6 H) N. ^9 L% v
Cyrix 的CPU 将返回:
7 {- ~8 O4 e, f+ d2 l: P1 o
2 Q  d  O) w  S& oEBX:43797269H) h$ m$ p5 |! l! [( f
EDX:78496E73H
% L3 h8 {4 F/ Z$ q* e! m; O7 W- RECX:74656164H
5 X/ t$ M% S7 p# v"CyrixInstead","Cyrix 来代替"。
) a$ b* G8 Z5 m9 @3 d3 U0 z) H; O) r% n4 ]4 e+ h/ ^
AMD 的CPU 将返回:
: T0 C! U$ Z- ]/ a" h7 g
7 n) x1 P9 F/ |, JEBX:41757468H+ W0 t" H4 F) B' t0 p; n
EDX:656E7469H5 \) m6 v" w8 C- c# N8 n  m
ECX:63414D44H1 H1 a2 Y  V) h* Y1 h
"AuthenticAMD", 可信的AMD。
! Z7 Q+ n' ?7 D, L5 V/ Z1 r& l: ^
  O' }; F- X, [+ i* u1 }  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
3 Z: C, u1 i0 b% B: s
" Y4 }: I( B( V) t/ q8 Z  (2)CPU 到底是几86, 是否支持MMX
1 I6 H+ g! N* u% Q* J1 z5 l  先让EAX=1,再调用CPUID $ R! m0 ~  u# q; T
  EAX的8到11位就表明是几86
4 h; x9 H4 p2 L5 l* S8 `: L
7 C# a3 O/ y$ g' ]1 [3 v/ U2 u( A3 - 386( Y7 q7 _# V# ~
4 - i486" Z' Y( B# g- Y. A$ G* A
5 - Pentium
5 Y  S+ i& g$ H2 \  U# h6 - Pentium Pro Pentium II  r' V( `8 |+ K8 V
2 - Dual Processors5 q# @' M) T3 D0 u; `2 k& e. l1 |

& \' d8 Z2 _2 W, T0 x5 V  EDX 的第0位:有无FPU
# Q) v' X! I, S& ?) l! I& G, ^* x/ X5 t$ |* Q
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
2 Z- ?1 x/ t# |$ H8 Y; B; P/ p1 o0 [7 U  Z( E  e" {
  (3) 专门检测是否P6架构
" d( A* h% I. z( s2 k  先让EAX=1,再调用CPUID 5 h9 z  _2 h! L5 h7 A
  如果AL=1,就是Pentium Pro 或Pentium II . X/ a% I9 K0 N( k5 L! Y
  (4) 专门检测AMD的CPU信息
( u. C& w0 N3 i7 j/ J6 s; X. u  先让EAX=80000001H,再调用CPUID
' C( S4 X; P' Z% l  如果EAX=51H, 是AMD K5
# m; c% b/ E( H  如 果EAX=66H, 是K6 $ w! S  j# l5 r/ |: E/ P8 r) H5 O
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) * S# E7 H1 ]2 v6 Q
  EDX 第23 位,CPU是否支持MMX,
; S: ^; z$ |6 t1 f- x8 a7 P6 [. N' {* i, X* y2 A
  程序如下:
& e  X# d, G  ]% B; V
* E9 V8 p: \4 v% o/ k+ E; l0 {- u2 F//------CPUID Instruction Demo Program------------* q" P+ E3 ?- y# R. Y
#include
' K) Q) }2 j' y) `* a- z#include
$ r: w, A% L# i# v5 q#pragma hdrstop
$ ]. r5 d- G! l+ I, O//------------------------------------------------* d3 d  N6 ]# v, t9 L- F5 n+ ^0 q' g- u
#pragma inline! t) H9 Q2 u. t
#pragma argsused4 W, w5 |) [: Q1 V
int main(int argc, char **argv)% v' |& I- a3 o& F2 F4 j
{  b7 M/ R2 d, h: B0 O3 v& g% s& g
char OEMString[13];
6 y8 r8 q6 r+ m/ @; k2 t: c8 kint iEAXValue,iEBXValue,iECXValue,iEDXValue;
5 J# j3 I" \4 a! ~+ L/ Z_asm {
9 b+ X0 G1 o  e0 U8 Rmov eax,06 H$ V' J# C' V( c" v6 ~/ j  q
cpuid1 p0 M2 z/ x) y$ K: u, y
mov DWORD PTR OEMString,ebx
. @7 z- `/ O% mmov DWORD PTR OEMString+4,edx
5 [. x; E# U  b& ]  v. |* kmov DWORD PTR OEMString+8,ecx
! n9 w; G" J% Hmov BYTE PTR OEMString+12,0# ]4 R& H: J2 d1 V- q
}- K' I5 l/ S7 C
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;; b1 |! V8 n; L+ A# R0 j9 }
_asm {* i2 |+ q/ z; \- L! m7 b5 [; Z
mov eax,1
& j4 q3 l8 @$ E% l1 K8 M3 Jcpuid
) ]* h! [$ [- p8 F+ ]" w/ L1 nmov iEAXValue,eax
. v& `+ E3 I# M) G! H& Imov iEBXValue,ebx
: D3 u* h4 ]0 V2 g( }: M$ emov iECXValue,ecx6 W- s5 l: p# ]5 o  e, a
mov iEDXValue,edx
9 E5 q, w( Y! j7 _* C9 V% E" ~}+ o( D1 D1 u; H/ ~1 e" |. R8 }
if(iEDXValue&0x800000)+ c4 J' Y, r. {' H: a# l
cout < < "This is MMX CPU"< < endl;
  z6 Z. O2 [. a( `5 R" s% Velse: d* C, l8 W5 s7 q' T, C$ J
cout < < "None MMX Support."< < endl;+ y* }2 w- q( B/ J/ o
int iCPUFamily=(0xf00 & iEAXValue) > >8;
" x' N0 T7 @* H% n' lcout < < "CPU Family is:"< < iCPUFamily< < endl;) G/ p9 |- |( H. ]* R
_asm{# C: B1 q+ y9 r7 o0 @/ d
mov eax,2
& k8 D) `  L/ _9 |* R5 E1 _4 s8 WCPUID
: o' }5 O5 {! R4 L- W' w4 M0 M8 m}3 N/ `) Q0 a) R7 C' F; |& e
if(_AL==1)
! u& y9 `0 x/ Kcout < < &quotentium Pro or Pentium II Found";3 O7 q' X! h$ Q
getch();
5 A, }7 R# L8 a. ~; N8 sreturn 0;. T3 i: ~% O3 Q6 G* c0 V+ v
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 00:57 , Processed in 0.018928 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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