|
利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指 令,只有emit 机器码了), 该指令可以被如下CPU识别:! k9 X" i% `7 n. E+ V
H6 g) t0 b( F1 `2 O: V
Intel 486 以上的CPU,
& v4 n: n4 p% G8 h% K+ B& ~4 uCyrix M1 以上的CPU,* P7 ^$ D B$ Y: Q: v: R& s! k
AMD Am486 以上的CPU
3 T' I1 J; {2 p2 K2 C+ i" T* D3 }* a* i/ j1 w: ^
(1) 取CPU OEM 字符串, 判断CPU 厂商
, w2 \5 b/ N% W) |' w, V! K( ] 先让EAX=0, 再调用CPUID 0 B# s* D* b/ x/ d9 \
Inel的CPU将返回:
+ u1 r& P7 e, l$ d9 v
0 _9 `! {0 K; t! K% @: A: EEBX:756E6547H 'Genu'
$ e/ ]- p. w: v5 e: t0 f/ mEDX:49656E69H 'ineI'
+ Q- d( D$ B2 O" zECX:6C65746EH 'ntel'$ c2 ~+ K( y7 m/ g9 O$ s8 j
EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。
. I' K+ F o7 j3 P7 a# F" G% }0 M' b! b& R. n
Cyrix 的CPU 将返回:
U0 _; O3 N8 Z
& W$ k3 O& o& `EBX:43797269H
2 e' u$ @6 S' K( b5 o, u4 UEDX:78496E73H
+ T& `1 m7 t; D% ~* g/ u( P' [8 W$ Q) N# vECX:74656164H
5 k- u; ? L* u"CyrixInstead","Cyrix 来代替"。7 n. C0 K4 B \
0 c# X4 `" p( b0 L5 G6 ^
AMD 的CPU 将返回:
( s+ U. N7 z9 y. e8 n5 X1 z/ t2 J& w+ n7 q9 g; }# C, I" i; x
EBX:41757468H6 M5 f/ I. P( x) O9 a
EDX:656E7469H- q& |: P4 |( i: F/ p% B" g, i
ECX:63414D44H+ z7 T, e$ c& l
"AuthenticAMD", 可信的AMD。
+ l5 f( v; A. X* j( m; k
3 @* I* H+ } _* T1 v- M9 w* ] 在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。
) Q$ X5 o9 X* z# t; A
* C+ ^0 x8 A3 A9 C/ y (2)CPU 到底是几86, 是否支持MMX
( Y5 _8 ?$ I% ?# t! ` 先让EAX=1,再调用CPUID 1 t$ s! o% Z& }3 ]9 l
EAX的8到11位就表明是几86 ! f! k) N) ^3 M
/ W- d* O2 ^) {* V( Q. I% `
3 - 386& k! k: H$ a) i; ?) Y) X' P3 m
4 - i486% x+ g$ r. q4 L& |/ N0 V
5 - Pentium
, m5 C7 w) t9 i+ S6 - Pentium Pro Pentium II1 Y/ w# p7 {- A/ ~- ~6 O
2 - Dual Processors
5 ^- p: Z2 G8 `, t. y: f5 o7 C: ~+ c6 k3 S) a
EDX 的第0位:有无FPU( {, L3 H, j9 f! j" S( [7 `
: F$ c- h: j: _) Q2 r
EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。 " }5 V% {* ]/ f0 i$ D# A
# l" y4 e% Y, o. p, f& a) ?9 R
(3) 专门检测是否P6架构
4 o. e4 ^, _1 f' F 先让EAX=1,再调用CPUID
; d( q/ R; f2 V4 m& l' [/ t 如果AL=1,就是Pentium Pro 或Pentium II 1 p! i# U/ n9 B1 \0 v. G
(4) 专门检测AMD的CPU信息
& W- N6 P# s- `& m 先让EAX=80000001H,再调用CPUID
2 e- A d c+ [3 j+ C' L! J4 d+ I 如果EAX=51H, 是AMD K5 : w: ] ?5 k- B
如 果EAX=66H, 是K6
3 u$ V5 Z0 y& a EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?) / U( |" B4 E" S* c2 z0 |
EDX 第23 位,CPU是否支持MMX, & t. g# j5 i2 z \7 q% y
5 a. h5 h% l9 j: {
程序如下:
/ l8 K' L/ n( R) e( L+ t7 ]
4 b ^. ]1 a6 u2 d, e( G Y/ H0 u9 L//------CPUID Instruction Demo Program------------
. R" n6 _5 h' g3 ~#include ; l+ H3 [! p2 q: E5 X* `' V
#include
6 @ O0 P n* L& [. T- E#pragma hdrstop
2 u( `1 o& V6 k% @: e; T//------------------------------------------------
. R6 [; e; p9 j9 T) M* }$ P/ p: F#pragma inline
0 w7 @( ], Z& t1 p7 o" @#pragma argsused3 |' X) M2 j0 O `4 d
int main(int argc, char **argv)
, J; m+ }4 ?8 |2 s" H4 {0 i! m{' }: N5 w3 g9 ?' E ~
char OEMString[13];8 R% k3 X \5 n4 k" D7 o; ~4 E
int iEAXValue,iEBXValue,iECXValue,iEDXValue;' L; j- Q$ b E9 d4 ]" {: @9 u
_asm {: D F2 Q# ^% |! V* t9 J
mov eax,0
0 m$ g5 o- U8 I' u3 }7 D0 n% x: kcpuid& t" ^; H6 C) O) Q
mov DWORD PTR OEMString,ebx
3 z( V6 I1 H$ y& xmov DWORD PTR OEMString+4,edx( q( L- ~! ^4 o& e5 ]; J
mov DWORD PTR OEMString+8,ecx# [4 _4 z0 G0 ~, f8 `, i. }
mov BYTE PTR OEMString+12,0; P# h, j' k: F! U H
}
1 d! v: Z& y, t+ ocout< < "This CPU 's OEM String is:"< < OEMString< < endl;# K; p. E4 J) j3 L3 a0 i
_asm {
7 V; Q$ Q' T% w1 v2 R/ E% imov eax,1' n9 D5 J) z- b( T) N0 F/ e
cpuid
: A( Q! K5 N: i! @mov iEAXValue,eax
$ H: ~) o8 Z- v& a" Q" i# imov iEBXValue,ebx
r; W8 C* F6 r0 Tmov iECXValue,ecx. ]: \) s4 } S* r: [
mov iEDXValue,edx
/ o1 v6 ^8 y0 g4 Z$ k7 o}6 Q7 z. D3 s9 w7 [) t
if(iEDXValue&0x800000)
v6 W2 R& a- n. l( X( z; Dcout < < "This is MMX CPU"< < endl;
; C& o( B& u+ l, Zelse/ F" ]% u6 g1 i6 B5 ]$ \/ ?, P
cout < < "None MMX Support."< < endl;$ F, B3 E' S+ O+ ^6 N( r! l
int iCPUFamily=(0xf00 & iEAXValue) > >8;
% n: h6 K; _, H2 \; _) V0 Wcout < < "CPU Family is:"< < iCPUFamily< < endl;
# h9 p! j4 u9 {( I_asm{
9 H/ k7 X* M4 @. {5 m# Nmov eax,2: o( C' d% D J
CPUID
0 u' ^3 |. Q7 q8 Q4 a9 h" K7 U {}
' B% H" B$ {3 A, L) N5 yif(_AL==1)7 v2 L: q1 W1 j O. z1 t
cout < < " entium Pro or Pentium II Found";
" P# n- _. O: ?getch();
$ N3 P# j$ g" B4 m5 c7 b& sreturn 0;
/ L) X1 J; W" B) e} |
|