在Visual C++编程中如何取得CPU的信息
程序员文章站
2023-11-30 23:52:34
在Visual C++编程中如何取得CPU的信息...
利用利用cpuid 汇编指令(机器码:0fh a2h, 如果你的编译器不支持cpuid 指令,只有emit 机器码了), 该指令可以被如下cpu识别:
intel 486 以上的cpu,
cyrix m1 以上的cpu,
amd am486 以上的cpu
(1) 取cpu oem 字符串, 判断cpu 厂商
先让eax=0, 再调用cpuid
inel的cpu将返回:
ebx:756e6547h 'genu'
edx:49656e69h 'inei'
ecx:6c65746eh 'ntel'
ebx,edx,ecx 将连成"genuineintel", 真正的intel。
cyrix 的cpu 将返回:
ebx:43797269h
edx:78496e73h
ecx:74656164h
"cyrixinstead","cyrix 来代替"。
amd 的cpu 将返回:
ebx:41757468h
edx:656e7469h
ecx:63414d44h
"authenticamd", 可信的amd。
在windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见cpu oem 字符串。
(2)cpu 到底是几86, 是否支持mmx
先让eax=1,再调用cpuid
eax的8到11位就表明是几86
3 - 386
4 - i486
5 - pentium
6 - pentium pro pentium ii
2 - dual processors
edx 的第0位:有无fpu
edx的第23位:cpu是否支持ia mmx,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看windows 的"该程序执行了非法指令,将被关 闭" 吧。
(3) 专门检测是否p6架构
先让eax=1,再调用cpuid
如果al=1,就是pentium pro 或pentium ii
(4) 专门检测amd的cpu信息
先让eax=80000001h,再调用cpuid
如果eax=51h, 是amd k5
如 果eax=66h, 是k6
edx第0 位: 是否有fpu( 多余的 !谁用过没fpu的k5,k6?)
edx 第23 位,cpu是否支持mmx,
程序如下:
//------cpuid instruction demo program------------
#include
#include
#pragma hdrstop
//------------------------------------------------
#pragma inline
#pragma argsused
int main(int argc, char **argv)
{
char oemstring[13];
int ieaxvalue,iebxvalue,iecxvalue,iedxvalue;
_asm {
mov eax,0
cpuid
mov dword ptr oemstring,ebx
mov dword ptr oemstring+4,edx
mov dword ptr oemstring+8,ecx
mov byte ptr oemstring+12,0
}
cout< < "this cpu 's oem string is:"< < oemstring< < endl;
_asm {
mov eax,1
cpuid
mov ieaxvalue,eax
mov iebxvalue,ebx
mov iecxvalue,ecx
mov iedxvalue,edx
}
if(iedxvalue&0x800000)
cout < < "this is mmx cpu"< < endl;
else
cout < < "none mmx support."< < endl;
int icpufamily=(0xf00 & ieaxvalue) > >8;
cout < < "cpu family is:"< < icpufamily< < endl;
_asm{
mov eax,2
cpuid
}
if(_al==1)
cout < < "pentium pro or pentium ii found";
getch();
return 0;
}
intel 486 以上的cpu,
cyrix m1 以上的cpu,
amd am486 以上的cpu
(1) 取cpu oem 字符串, 判断cpu 厂商
先让eax=0, 再调用cpuid
inel的cpu将返回:
ebx:756e6547h 'genu'
edx:49656e69h 'inei'
ecx:6c65746eh 'ntel'
ebx,edx,ecx 将连成"genuineintel", 真正的intel。
cyrix 的cpu 将返回:
ebx:43797269h
edx:78496e73h
ecx:74656164h
"cyrixinstead","cyrix 来代替"。
amd 的cpu 将返回:
ebx:41757468h
edx:656e7469h
ecx:63414d44h
"authenticamd", 可信的amd。
在windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见cpu oem 字符串。
(2)cpu 到底是几86, 是否支持mmx
先让eax=1,再调用cpuid
eax的8到11位就表明是几86
3 - 386
4 - i486
5 - pentium
6 - pentium pro pentium ii
2 - dual processors
edx 的第0位:有无fpu
edx的第23位:cpu是否支持ia mmx,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看windows 的"该程序执行了非法指令,将被关 闭" 吧。
(3) 专门检测是否p6架构
先让eax=1,再调用cpuid
如果al=1,就是pentium pro 或pentium ii
(4) 专门检测amd的cpu信息
先让eax=80000001h,再调用cpuid
如果eax=51h, 是amd k5
如 果eax=66h, 是k6
edx第0 位: 是否有fpu( 多余的 !谁用过没fpu的k5,k6?)
edx 第23 位,cpu是否支持mmx,
程序如下:
//------cpuid instruction demo program------------
#include
#include
#pragma hdrstop
//------------------------------------------------
#pragma inline
#pragma argsused
int main(int argc, char **argv)
{
char oemstring[13];
int ieaxvalue,iebxvalue,iecxvalue,iedxvalue;
_asm {
mov eax,0
cpuid
mov dword ptr oemstring,ebx
mov dword ptr oemstring+4,edx
mov dword ptr oemstring+8,ecx
mov byte ptr oemstring+12,0
}
cout< < "this cpu 's oem string is:"< < oemstring< < endl;
_asm {
mov eax,1
cpuid
mov ieaxvalue,eax
mov iebxvalue,ebx
mov iecxvalue,ecx
mov iedxvalue,edx
}
if(iedxvalue&0x800000)
cout < < "this is mmx cpu"< < endl;
else
cout < < "none mmx support."< < endl;
int icpufamily=(0xf00 & ieaxvalue) > >8;
cout < < "cpu family is:"< < icpufamily< < endl;
_asm{
mov eax,2
cpuid
}
if(_al==1)
cout < < "pentium pro or pentium ii found";
getch();
return 0;
}
下一篇: 浏览器意外关闭的网页怎么恢复?