|
|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:( L" U6 I% g. K# u0 g! D
- n7 Y8 v: _% i% m+ Z9 g9 sIntel 486 以上的CPU,
% G! ~4 c: Q3 K: P3 H+ rCyrix M1 以上的CPU,5 m7 P* D {) \% i. ?
AMD Am486 以上的CPU& K8 r9 k" _! v2 e9 `
2 t- }2 T+ S- Q4 |+ y0 k2 w1 q
(1) 取CPU OEM 字符串, 判断CPU 厂商 ) J& {+ M& E3 g3 H" W" Z# m/ R6 U, I7 C3 l
先让EAX=0, 再调用CPUID
& d b+ i" M* j# J( w" V, c Inel的CPU将返回: S d2 _3 i/ o. T& z5 b
$ `4 N- ?" `7 ]3 E# gEBX:756E6547H 'Genu'
# k5 g6 O: U: W2 B* h$ |( `! GEDX:49656E69H 'ineI'
- f ?3 Q: w6 WECX:6C65746EH 'ntel'+ T- u1 u6 R& x1 V, u6 [
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。2 _+ O0 b. \) p9 Z$ J0 l4 k
5 w& M2 k( R/ g" e3 E; P7 g
Cyrix 的CPU 将返回:
" A; v0 f8 n! v3 W. F
$ c @; d$ n2 A* ]: a# D. \EBX:43797269H
4 o- l! i* M7 E/ U7 z3 _1 @, QEDX:78496E73H
3 I1 M9 o$ `% S7 @, P% JECX:74656164H' p3 O# |5 g0 x, z7 ]8 _4 {# i
"CyrixInstead","Cyrix 来代替"。
& p3 T/ U% r6 L0 d3 o* V& l2 D2 h
AMD 的CPU 将返回:
; x3 I" n7 L1 X/ x
6 x* C% m9 H l5 ?7 [EBX:41757468H# H' G% l; v' C1 q' c
EDX:656E7469H& D2 I1 j! M0 e; y# T
ECX:63414D44H9 a& q( V/ X, o7 l [3 D
"AuthenticAMD", 可信的AMD。" x h8 V$ Z- V9 X7 o( H' ]) \- Q& l
1 }" m( c# Z# I0 O- c, Y- \! [ 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。; w: k- c* J: S/ X
) S1 ^& O7 y2 e: R# h* P* ^8 K (2)CPU 到底是几86, 是否支持MMX ' Z7 x& [8 \7 I9 {# M0 C5 L+ P
先让EAX=1,再调用CPUID
5 R0 U1 ]( E: F5 |' \ EAX的8到11位就表明是几86 % L) |% M8 k5 l
' B' M8 [4 ]4 U$ v$ R0 d3 - 3861 N4 Q- ?" j9 n; `
4 - i486: y+ u8 c: `% E
5 - Pentium
, B5 I+ C- t3 n# @# Z( k1 k, L! f" m6 - Pentium Pro Pentium II! H3 d* N+ z2 \. @& L" `
2 - Dual Processors' y' y0 k7 _. {5 `. x! t
& c. F% A' g% b! a9 H" d EDX 的第0位:有无FPU
5 v/ \, X2 r# N+ Z, w) ]6 T* {
0 p* G) D5 L/ Q: ] EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。
. D) O5 Y! H4 ]3 M$ S7 Y" b& J- J( k7 a
(3) 专门检测是否P6架构
( i! _0 R& O! r; j# } 先让EAX=1,再调用CPUID
' J9 o6 q1 A. T) R7 r+ q 如果AL=1,就是Pentium Pro 或Pentium II 5 L0 J) H) ^) L4 O+ G
(4) 专门检测AMD的CPU信息
6 {' h% D O D2 J# L 先让EAX=80000001H,再调用CPUID ( {# K. T& H- _% w* `
如果EAX=51H, 是AMD K5
# Z+ b: v$ O. d8 ]: p: r 如 果EAX=66H, 是K6
0 H# v; y1 S9 H8 o' r* a; E. N( E( ~ EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) 1 ^: M6 Y7 A4 d( I+ O3 w0 u( v
EDX 第23 位,CPU是否支持MMX, ! k) y+ C* Y& }/ Z& s3 k
^! o9 s' v; \) y" d+ B
程序如下:. ^# A) U/ B$ T& R, c! d# t" M
, W; A+ x: Q+ o4 i! n9 g9 ~# ^//------CPUID Instruction Demo Program------------
- v, I' I& C! v+ v% d: L C! F7 L: P#include 8 `# b+ |4 j( k, {- W
#include % u5 P' h: _9 @% d1 p6 @5 }
#pragma hdrstop
; F8 M0 u6 y" t |//------------------------------------------------
! y) q$ {# Y+ r7 |; E#pragma inline
" {8 C. ?9 q( m. z#pragma argsused: B/ W& a, d5 {. k
int main(int argc, char **argv)/ R0 s4 R' a( {: ]
{
" J+ M' C! k6 a, @$ v) Cchar OEMString[13];
1 N& v+ u' X7 v" ~9 ^1 `7 l- hint iEAXValue,iEBXValue,iECXValue,iEDXValue;& L) O& B/ a* l' s0 J$ L2 Q5 h: l8 C
_asm {+ `$ T. r" d; i; v6 s; g! A+ l
mov eax,0+ ~2 F1 j m4 d, U# {; o3 C
cpuid
! q, f! F8 M/ Amov DWORD PTR OEMString,ebx
# q: l: K- i( M7 e& X% ]6 Cmov DWORD PTR OEMString+4,edx9 d# w3 F! c1 j O3 Z
mov DWORD PTR OEMString+8,ecx- Z1 p* M* y- ]9 B* n
mov BYTE PTR OEMString+12,0
2 @" a2 G% h% D}, c! G: |: I* }( U* l$ v6 M
cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
' ]$ o, X6 _+ p% L_asm {
. v( v; _5 k+ X2 U$ \! B/ tmov eax,1
2 t( k2 v0 I L6 ]& d0 g/ |; Scpuid i, g5 p% ?( P' [7 p' D" L
mov iEAXValue,eax
$ ^$ b, v4 R* P8 i- Lmov iEBXValue,ebx
b" k5 u) l; O1 n9 Y. v! _& p4 zmov iECXValue,ecx" g% Q7 [& p! E
mov iEDXValue,edx) N7 G: V/ h& q, e9 T
}
$ ?- x8 e+ I+ D2 ^" Vif(iEDXValue&0x800000)" M/ f0 L6 D$ ]' c8 l" R0 H% {- t
cout < < "This is MMX CPU"< < endl;
( ]* a- O8 n$ t9 B }: kelse
4 Q/ D3 k5 D; Rcout < < "None MMX Support."< < endl;9 D8 ]5 v: F1 T6 s9 ?/ ~/ a
int iCPUFamily=(0xf00 & iEAXValue) > >8;
) |0 `' a0 b& k, D1 t Gcout < < "CPU Family is:"< < iCPUFamily< < endl;
# M: f) B; I8 I_asm{$ C8 ^: e9 Z8 g6 ` N
mov eax,2
# o, X8 J( C2 ]# @" c0 DCPUID
! j& O6 Y/ I+ ]) M& {$ z5 }}5 a! Q. p- e0 J# |# H0 ?
if(_AL==1)& w0 L2 w/ V4 a& S
cout < < " entium Pro or Pentium II Found";2 u$ }; S( p. G# N2 K9 U8 R
getch();7 g) ]6 R3 u5 V$ d( k+ e; F7 J6 G
return 0;9 k2 k7 F& m' o; I
} |
|