C语言 编程实现获取cpu信息
答案:2 悬赏:40 手机版
解决时间 2021-03-08 14:04
- 提问者网友:黑米和小志
- 2021-03-08 03:17
linux系统 程序实现获取cpu信息, 比如类似于/prog/cpuinfo 的信息
最佳答案
- 五星知识达人网友:白昼之月
- 2021-03-08 03:41
耐心看看啊,运行通过啦,希望对你有帮助啊!
#include
unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
//执行CPUID指令
void cpuid(unsigned int veax1)
{
_asm{
mov eax,veax1
cpuid
mov veax,eax
mov vebx,ebx
mov vecx,ecx
mov vedx,edx
}
}
//做移位操作,把寄存器中的ASCII码,以字符形式输出
void LeftMove(unsigned int var)
{
printf("%c",var);
for(int i=0;i<3;i++)
{
var=(var>>;
printf("%c",var);
}
}
//做移位操作,把寄存器中的值以“%d”形式输出
void LM(unsigned int var)
{
printf("%d",var);
for(int i=0;i<3;i++)
{
var=(var>>;
printf("%d",var);
}
}
//得到CPU的生产厂商(当EAX值为0时),依次存放在EBX,EDX,ECX中
void getCpuName()
{
cpuid(0);
LeftMove(vebx);
LeftMove(vedx);
LeftMove(vecx);
printf("\n";
}
//得到CPU的商标,当EAX中的值为0x80000003和0x80000004时分别返回16个字符,组成商标
//依次存放在EAX,EBX,ECX,EDX中
void getCpuBrand()
{
for(int j=0;j<2;j++)
{
cpuid(0x80000003+j);
LeftMove(veax);
LeftMove(vebx);
LeftMove(vecx);
LeftMove(vedx);
}
printf("\n";
}
//获得CPU的特性,参数是eax = 1,返回值放在edx和ecx,通过验证edx或者ecx的某一个bit,
//可以获得CPU的一个特性是否被支持。比如说,edx的bit 32代表是否支持MMX,
//edx的bit 28代表是否支持Hyper-Threading,ecx的bit 7代表是否支持speed sted。
void getCpuFeature()
{//由于特性太多,无法一一编写,需要的时候再写,方法是一样的。
}
//获得CPU序列号,获得序列号需要两个步骤,首先用eax = 1做参数,返回的eax中存储序列号的高两个WORD。
//用eax = 3做参数,返回ecx和edx按从低位到高位的顺序存储前4个WORD。
void getCpuSeris()
{
cpuid(1);
LM(veax);
cpuid(3);
LM(vecx);
LM(vedx);
printf("\n";
}
void main()
{
getCpuName();
getCpuBrand();
getCpuSeris();
}
#include
unsigned int veax;
unsigned int vebx;
unsigned int vedx;
unsigned int vecx;
//执行CPUID指令
void cpuid(unsigned int veax1)
{
_asm{
mov eax,veax1
cpuid
mov veax,eax
mov vebx,ebx
mov vecx,ecx
mov vedx,edx
}
}
//做移位操作,把寄存器中的ASCII码,以字符形式输出
void LeftMove(unsigned int var)
{
printf("%c",var);
for(int i=0;i<3;i++)
{
var=(var>>;
printf("%c",var);
}
}
//做移位操作,把寄存器中的值以“%d”形式输出
void LM(unsigned int var)
{
printf("%d",var);
for(int i=0;i<3;i++)
{
var=(var>>;
printf("%d",var);
}
}
//得到CPU的生产厂商(当EAX值为0时),依次存放在EBX,EDX,ECX中
void getCpuName()
{
cpuid(0);
LeftMove(vebx);
LeftMove(vedx);
LeftMove(vecx);
printf("\n";
}
//得到CPU的商标,当EAX中的值为0x80000003和0x80000004时分别返回16个字符,组成商标
//依次存放在EAX,EBX,ECX,EDX中
void getCpuBrand()
{
for(int j=0;j<2;j++)
{
cpuid(0x80000003+j);
LeftMove(veax);
LeftMove(vebx);
LeftMove(vecx);
LeftMove(vedx);
}
printf("\n";
}
//获得CPU的特性,参数是eax = 1,返回值放在edx和ecx,通过验证edx或者ecx的某一个bit,
//可以获得CPU的一个特性是否被支持。比如说,edx的bit 32代表是否支持MMX,
//edx的bit 28代表是否支持Hyper-Threading,ecx的bit 7代表是否支持speed sted。
void getCpuFeature()
{//由于特性太多,无法一一编写,需要的时候再写,方法是一样的。
}
//获得CPU序列号,获得序列号需要两个步骤,首先用eax = 1做参数,返回的eax中存储序列号的高两个WORD。
//用eax = 3做参数,返回ecx和edx按从低位到高位的顺序存储前4个WORD。
void getCpuSeris()
{
cpuid(1);
LM(veax);
cpuid(3);
LM(vecx);
LM(vedx);
printf("\n";
}
void main()
{
getCpuName();
getCpuBrand();
getCpuSeris();
}
全部回答
- 1楼网友:刀戟声无边
- 2021-03-08 04:06
如果是获取 cpu 时钟 的 tick:
clock_t tick1,tick2;
tick1=clock(); // 开机到执行这句时的毫秒数 ms
等待一会
tick2=clock(); // 开机到执行这句时的毫秒数 ms
dt = (double) (tick2 - tick1); // 或得时间差。
===============
如果是 获取 cpu cycle count
#include
// windows
#ifdef _win32
#include
uint64_t rdtsc(){
return __rdtsc();
}
// linux/gcc
#else
uint64_t rdtsc(){
unsigned int lo,hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return ((uint64_t)hi << 32) | lo;
}
#endif
===================
获取高精度时间(ms vc++ 6.0编译器):
// pentium instruction "read time stamp counter".
__forceinline unsigned _int64 my_clock(void)
{
_asm _emit 0x0f
_asm _emit 0x31
}
unsigned _int64 start(void) { return my_clock();}
unsigned _int64 stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
{return my_clock()-m_start - m_overhead; }
==========
获取cpu 速度(ms vc++ 6.0编译器):
void get_cpu_speed()
{
unsigned _int64 m_start=0, m_overhead=0;
unsigned int cpuspeedmhz;
m_start = my_clock();
m_overhead = my_clock() - m_start - m_overhead;
printf("overhead for calling my_clock=%i64d\n", m_overhead);
m_start = my_clock();
wait_ms(2000);
cpuspeedmhz=(unsigned int) ( (my_clock()- m_start - m_overhead) / 2000000);
printf("cpu_speed_mhz: %u\n",cpuspeedmhz);
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯