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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:" l$ F6 H% g3 u( I
1 Y1 y/ V+ `7 u% V, O/ _
Intel 486 以上的CPU,1 x5 S3 |0 p  R3 k+ u
Cyrix M1 以上的CPU,
8 K: j( {& M: @& w( V5 e& a& tAMD Am486 以上的CPU
0 _  c/ r- w" p% j, z; R2 \! Q* {
; W6 D: A" t# t  (1) 取CPU OEM 字符串, 判断CPU 厂商 4 L8 A% B7 q" P4 D3 i  G
  先让EAX=0, 再调用CPUID 4 q: M' L, H  y
   Inel的CPU将返回:
" w! B% g  z1 p
5 O- j0 M( u; C  F! z4 L0 NEBX:756E6547H 'Genu'0 U/ U) l; e3 C  c; m2 M
EDX:49656E69H 'ineI'% ?1 S; y6 j6 N: {7 {
ECX:6C65746EH 'ntel'" g1 q: G: w  X% a/ e  t
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。7 ?3 q  M. R% q# j' o1 n1 q. N! X( e. ]
+ x* @. ?; f" p  @9 C* ]1 Y0 e. A
Cyrix 的CPU 将返回:- N0 ]6 M+ a& @; y4 x# J

6 c$ @  j* J3 D" e5 k5 yEBX:43797269H! l: E8 W, z0 |0 a; G* A( C
EDX:78496E73H
1 @$ E! A9 I) X/ v8 C6 c$ l2 [ECX:74656164H
2 o+ E( m4 p" |7 W; b* U+ m/ N"CyrixInstead","Cyrix 来代替"。
' z: a% A* q3 v, m. f& ~& N8 d+ d; R) E0 o
AMD 的CPU 将返回:
" V" P! G8 ?# P0 c- X0 |" A( a. B' w: b$ Z. _& [2 }
EBX:41757468H
" H" p# P) k4 K* IEDX:656E7469H
) M/ X$ M4 t8 n. {* QECX:63414D44H* J! L6 T6 P+ p0 P
"AuthenticAMD", 可信的AMD。% i2 l" u# ~" @  J6 d

" l; N4 j  z2 w- u8 ?$ a  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。' ^0 u0 Q" }9 A7 L! E
. C/ n7 m2 _5 u- F1 g& U9 D1 v3 b
  (2)CPU 到底是几86, 是否支持MMX
# h% L% S0 b5 |4 f9 K  先让EAX=1,再调用CPUID
$ b3 H, V* K* q) i3 G  EAX的8到11位就表明是几86
4 x9 m) R* I( {) l5 `
+ C( K, L  j/ b3 - 3860 H* \( |' B. S4 J* \7 k
4 - i4864 {- p- {" h  p$ A/ F
5 - Pentium
! v$ [1 n1 n0 L6 - Pentium Pro Pentium II- m$ L, s  h$ J* o$ X' |  e
2 - Dual Processors$ H8 p/ s: Z0 e0 x9 {% w

% x7 U! A* R" b" U  EDX 的第0位:有无FPU: Z  @, ]7 L6 F, i$ r3 b$ W; [* A
  D6 o0 @+ O; @* O+ ^) H
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
# x9 W2 \$ \9 k7 c# ~- Q6 b2 Z$ [; u: H$ {% e9 g5 Y
  (3) 专门检测是否P6架构
& H2 h* l: X0 `" u9 Q  先让EAX=1,再调用CPUID : d" O3 x: d/ F
  如果AL=1,就是Pentium Pro 或Pentium II
1 q6 l5 N, G% A8 L) N  m8 R" g  (4) 专门检测AMD的CPU信息 5 X  p* p- s$ i7 l/ v" i
  先让EAX=80000001H,再调用CPUID 7 h4 Y: q( E% l: s$ V+ ?
  如果EAX=51H, 是AMD K5
8 B0 Q' s, b2 _7 }% T, g  如 果EAX=66H, 是K6
$ J9 O( @% E. R) k# @  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) ; z; m# s$ E8 ?. E; _
  EDX 第23 位,CPU是否支持MMX, # N9 K6 H" j$ n. K" u# x
' B2 L3 F$ J- I( M* W# B
  程序如下:
8 Q: L9 K5 n* D9 h$ A% q$ E! d7 B. D7 S& w7 q; G+ ?( d+ H
//------CPUID Instruction Demo Program------------! ?0 A( p3 V5 d8 h% j0 t
#include
; i! r7 _$ y/ i#include
& V2 Z; ~6 V. m' t& N. e5 H) E#pragma hdrstop8 B& P3 j! s( q7 `
//------------------------------------------------
9 R3 J9 [% I5 k#pragma inline4 t4 w: E! r3 A& Y0 [. ^
#pragma argsused! Y9 c6 [9 T) ]
int main(int argc, char **argv)1 J0 Z' m! x4 p( m3 |4 t
{
* n  c. ~. c% Z( M3 Q  K; tchar OEMString[13];
( G. {7 r' X, F& k0 Jint iEAXValue,iEBXValue,iECXValue,iEDXValue;3 F/ d  b$ j" w# f: z3 E" ^
_asm {
( ?/ U( i$ T$ p  U1 M) q! qmov eax,0% [+ d4 {, z) M* J
cpuid' {1 N; T2 W& L% M+ ]4 ^
mov DWORD PTR OEMString,ebx" I- g& f3 h6 e1 m  i6 ]% H5 ^
mov DWORD PTR OEMString+4,edx
3 k$ B9 l8 w% D3 G8 |% o! }mov DWORD PTR OEMString+8,ecx) N5 c# u4 s, k  l  d* ~
mov BYTE PTR OEMString+12,0
7 G9 h# x* B5 \7 t; a}
4 K- |# J- f6 ]+ Z1 Y+ q1 Ycout< < "This CPU 's OEM String is:"< < OEMString< < endl;
. n5 a8 h1 e4 j/ D; @, R7 d- j_asm {
8 R6 F* R0 V. q0 Emov eax,1
+ V  E* T- {5 Ecpuid
% X  f, P* n4 {7 lmov iEAXValue,eax1 a# G/ X/ Q; N& k4 @4 v/ P% D/ d& t( [
mov iEBXValue,ebx6 n: J- l$ P& q: I3 h
mov iECXValue,ecx$ f0 C7 _$ \( F8 ?8 V" U
mov iEDXValue,edx
- U' J- f# k: n0 d}* ~8 P7 l7 T7 [. o5 }7 [* N
if(iEDXValue&0x800000)+ s# B  Y8 o, x, z
cout < < "This is MMX CPU"< < endl;
, b' Q3 M7 p% i  `0 selse
' [5 E8 L" Q+ ]) C. U$ j- Pcout < < "None MMX Support."< < endl;- Y. Z6 X5 _% K
int iCPUFamily=(0xf00 & iEAXValue) > >8;  F  x: i- ~) B
cout < < "CPU Family is:"< < iCPUFamily< < endl;
+ `  j" B, A3 {* m_asm{
5 {. K/ S9 y9 @1 `. {  Fmov eax,2& l4 f! F! r& Y5 e. r
CPUID4 }3 P$ h" d% E( N3 L
}; l7 r; U/ Q; _+ P5 E' F7 O
if(_AL==1)! o3 G* N; J$ E& W% g& r
cout < < &quotentium Pro or Pentium II Found";
7 E# a8 b( w& M9 d8 k( zgetch();- f% F+ j2 V) v/ |
return 0;3 @" w% {+ z* A* E. |( C& B1 g& l' T6 K
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 22:43 , Processed in 0.021578 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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