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

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

[复制链接]
发表于 2005-5-10 23:02:06 | 显示全部楼层 |阅读模式
    利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:; w5 M8 H# j% E8 |! A3 c, o* v" Y

8 g& J, A& E0 ~( M1 E& k3 K) Y/ tIntel 486 以上的CPU,
9 C# s( D$ ?1 g! ?/ [2 b1 n$ S1 FCyrix M1 以上的CPU,# p" [5 _# w6 J
AMD Am486 以上的CPU
! V0 _+ A2 c  E9 g: g' K/ H
! a. v$ _3 M3 V$ q% Y  (1) 取CPU OEM 字符串, 判断CPU 厂商 + }" K2 M% L. H/ [2 P& w* T
  先让EAX=0, 再调用CPUID
9 H. S1 E4 h6 v$ O# p   Inel的CPU将返回:
& n8 {- P* u, m2 P: ]" `; k3 ~7 _, X5 u# ^& l: U3 @& c# b% {: f
EBX:756E6547H 'Genu'
9 Y9 g7 X2 g6 y3 ?; p( @5 uEDX:49656E69H 'ineI'. `- q$ b/ x5 B" l! k% F. i8 v) Z
ECX:6C65746EH 'ntel'1 |; Y4 D3 ~% p
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。+ [$ X0 Y) l4 F) @8 y& X/ v

2 [3 \, v; r1 i% zCyrix 的CPU 将返回:
: ]" |9 ]% S& g; B& b; F' G* [6 w/ H& Z" ~9 q
EBX:43797269H
) R, y' p9 j% I# j8 H" E$ CEDX:78496E73H
3 Z6 d6 M  m7 |# G' R. kECX:74656164H
8 D, u; g5 w( L' J" c: I3 Y* r"CyrixInstead","Cyrix 来代替"。! M$ \) d) j( [( q" w& j

; q) R5 A, p9 R3 TAMD 的CPU 将返回:
* ^1 K$ ?) O4 S) l; `; e, O( N  r# V# O# N  \
EBX:41757468H& L! P% }, C( A
EDX:656E7469H
0 O, I( R# B; k# B, FECX:63414D44H
7 K" V+ O! R- J* F"AuthenticAMD", 可信的AMD。% F7 m$ l) }1 e: _

1 _$ b/ Z6 M1 l% J( a: @  在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。$ [1 I2 S& n6 E( y* N$ E! R0 M5 f

: P$ s3 j4 {/ i) Y  (2)CPU 到底是几86, 是否支持MMX
# v: S; H  g$ j; R( H( L- V+ a1 ?  先让EAX=1,再调用CPUID * F& a, y0 _9 D4 f. ?+ C) l8 c
  EAX的8到11位就表明是几86
$ p4 ^: g0 e; y$ x0 C6 }+ {8 o( Q  v' z* B$ @- @
3 - 386" }$ u6 |$ }, W) Y! [  T
4 - i486
- C/ ~3 }) E9 o; Y1 ]5 - Pentium4 u- C5 C, z5 M# \9 {
6 - Pentium Pro Pentium II/ @- _+ s. A" M/ e( ~, q
2 - Dual Processors, p" L- i' r& f/ c/ Y

: C: d( Y: Q9 _+ d7 G  EDX 的第0位:有无FPU
  i* h$ }( d" T8 `" d8 H- L: f/ a6 F; S: j9 X
  EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
4 i' l% A7 `% P7 w& D( Z
0 A- q) h* }7 p5 h  (3) 专门检测是否P6架构; D" C7 L' N+ f, ^6 n3 l9 t& K
  先让EAX=1,再调用CPUID
/ Z: [! a% ~" o6 c  如果AL=1,就是Pentium Pro 或Pentium II
5 a: c& i2 w* O+ o9 r  (4) 专门检测AMD的CPU信息
, V( i# w& ?" N  i$ y- X' @5 ~  先让EAX=80000001H,再调用CPUID
7 P* w" k7 Y( f/ v  如果EAX=51H, 是AMD K5 0 f# `8 {, G# n1 q5 A$ E
  如 果EAX=66H, 是K6 4 u7 |' W$ }- a2 b& K# }' F
  EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 0 r; v# R9 j& `! q- Y$ r, v3 l- @
  EDX 第23 位,CPU是否支持MMX,
& Z' v; n! R+ m% i8 m" X9 K) }) E: q
  程序如下:, @  @/ o% ^$ h! U

! V: k0 O, E( n  n1 T//------CPUID Instruction Demo Program------------
! O0 v# y. n- E#include
, n7 {; ^+ p. s1 x#include
3 M5 U% t1 a/ W! w; e, D8 S#pragma hdrstop
7 D7 N: Y5 O3 j3 T4 f+ D' T5 z# O+ e/ V//------------------------------------------------: k7 A/ _. d& Y$ }5 F" M" l
#pragma inline: `* X+ A9 w- O0 x0 `
#pragma argsused
; y7 a# K' L  u3 y* M" d, |int main(int argc, char **argv)0 |# U( X0 s: K
{/ e( {( I: ]8 {* c, X
char OEMString[13];* H( b: \4 L6 I* [3 L
int iEAXValue,iEBXValue,iECXValue,iEDXValue;8 I2 p5 K" \, u% b- C3 f! j' P2 C5 w
_asm {8 d$ d. ?$ Y- U; a. a
mov eax,01 i; Q7 Y7 j" A. p" P' m. n
cpuid
# y/ j" ?& G9 v! Bmov DWORD PTR OEMString,ebx8 ]9 v% P8 Z5 A
mov DWORD PTR OEMString+4,edx3 M/ }/ g8 @1 b$ {# n
mov DWORD PTR OEMString+8,ecx
+ w' ]; l; \; `: Q) Mmov BYTE PTR OEMString+12,0
3 [1 s7 C' @# y$ r) Q; \9 @* o2 i}
) X! I9 o4 }) F( I  Q' o& g# |; Qcout< < "This CPU 's OEM String is:"< < OEMString< < endl;
9 {' g3 b1 S+ q0 O$ r_asm {$ x# X* t% K) ]" B
mov eax,1+ W: H7 N% S1 W5 G( @% ^
cpuid  Q0 h, N: [0 H" L5 v
mov iEAXValue,eax
8 e! Q4 h% k* ?. h9 v# Jmov iEBXValue,ebx
8 ~, {' [/ X2 V. `  f- o3 Dmov iECXValue,ecx% v- x$ T# z- I! c9 G
mov iEDXValue,edx
9 S: y0 E" _6 I, P: J/ z}9 _  G3 s  R: I  U$ q2 q
if(iEDXValue&0x800000)
; \1 x6 K: M" `2 j4 T) I! Ncout < < "This is MMX CPU"< < endl;# J1 M& h2 p$ X+ a& D; \6 Y
else
  x4 t. }1 e" \$ G& [5 `- d0 `, Bcout < < "None MMX Support."< < endl;5 x4 n' I% [7 {  J/ Y
int iCPUFamily=(0xf00 & iEAXValue) > >8;
( T  `- r' ~' ?( g, Lcout < < "CPU Family is:"< < iCPUFamily< < endl;
- m5 h4 m8 Z& s0 g_asm{. N+ J( j" A0 `! B* v! R' [. V
mov eax,2
9 p5 A4 p% z- y5 z1 s, mCPUID
8 J+ ~6 q4 q( Y2 p6 X. I}6 |! A0 E$ Q, A) j; X) L
if(_AL==1)
+ X. F- i9 p; Q. M8 ^4 N5 Jcout < < &quotentium Pro or Pentium II Found";( S  z1 {) T; }2 b( b
getch();
4 \: Q/ h% C1 q. R3 ]return 0;
0 N2 u  I# A0 z/ k}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:49 , Processed in 0.019303 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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