永发信息网

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();
}
全部回答
  • 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); }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯