|
|
利用利用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 < < " entium 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} |
|