当前位置:首页 » 编程语言 » c语言查看cpu型号
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言查看cpu型号

发布时间: 2022-08-15 18:35:09

c语言怎么取CPU的各项信息

intel IA32架构下CPU提供了获取CPU信息的指令CPUID,用该指令能获取CPU信息,使用方法和说明如下。要注意的是,一下如有小于号的,都不是英文的小于号,要用都得该为英文的小于号。 1、什么是cpuid指令 CPUID指令是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存等一系列CPU相关的东西。 2、cpuid指令的使用 cpuid使用eax作为输入参数,eax,ebx,ecx,edx作为输出参数,举个例子: __asm { mov eax, 1 cpuid ... } 以上代码以1为输入参数,执行cpuid后,所有寄存器的值都被返回值填充。针对不同的输入参数eax的值,输出参数的意义都不相同。 为了更好的在C++中使用cpuid指令,可以使用类对指令进行封装,在类中定义一个专门的函数负责cpuid的执行,他需要一个输入参数。还需要定义四个成员变量存储cpuid执行以后返回来的值。由于这四个寄存器都是32位长的,可以使用unsinged long 类型变量存储。 typedef unsigned long DWORD class CPUID { public: ... private: void Executecpuid(DWORD eax); // 用来实现cpuid DWORD m_eax; // 存储返回的eax DWORD m_ebx; // 存储返回的ebx DWORD m_ecx; // 存储返回的ecx DWORD m_edx; // 存储返回的edx ... } void CPUID::Executecpuid(DWORD veax) { // 因为嵌入式的汇编代码不能识别 类成员变量 // 所以定义四个临时变量作为过渡 DWORD deax; DWORD debx; DWORD decx; DWORD dedx; __asm { mov eax, veax ;将输入参数移入eax cpuid ;执行cpuid mov deax, eax ;以下四行代码把寄存器中的变量存入临时变量 mov debx, ebx mov decx, ecx mov dedx, edx } m_eax = deax; // 把临时变量中的内容放入类成员变量 m_ebx = debx; m_ecx = decx; m_edx = dedx; } 这样就可以通过直接调用Executecupid()函数的方式来执行cpuid指令了,返回值存在类成员变量m_eax, m_ebx, m_ecx和m_edx中。 3、获得CPU的制造商信息(Vender ID String) 把eax = 0作为输入参数,可以得到CPU的制造商信息。 cpuid指令执行以后,会返回一个12字符的制造商信息,前四个字符的ASC码按低位到高位放在ebx,中间四个放在edx,最后四个字符放在ecx。比如说,对于intel的cpu,会返回一个“GenuineIntel”的字符串,返回值的存储格式为: 31 23 15 07 00 EBX| u (75)| n (6E)| e (65)| G (47) EDX| I (49)| e (65)| n (6E)| i (69) ECX| l (6C)| e (65)| t (74)| n (6E) 因此可以这样实现他: string CPUID::GetVID() { char cVID[13]; // 字符串,用来存储制造商信息 memset(cVID, 0, 13); // 把数组清0 Executecpuid(0); // 执行cpuid指令,使用输入参数 eax = 0 memcpy(cVID, &m_ebx, 4); // 复制前四个字符到数组 memcpy(cVID+4, &m_edx, 4); // 复制中间四个字符到数组 memcpy(cVID+8, &m_ecx, 4); // 复制最后四个字符到数组 return string(cVID); // 以string的形式返回 } 4、获得CPU商标信息(Brand String) 在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息,这就是CPU的商标字符串。CPU的商标字符串也是通过cpuid得到的。由于商标的字符串很长(48个字符),所以不能在一次cpuid指令执行时全部得到,所以intel把它分成了3个操作,eax的输入参数分别是0x80000002,0x80000003,0x80000004,每次返回的16个字符,按照从低位到高位的顺序依次放在eax, ebx, ecx, edx。因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次cpuid。 string CPUID::GetBrand() { const DWORD BRANDID = 0x80000002; // 从0x80000002开始,到0x80000004结束 char cBrand[49]; // 用来存储商标字符串,48个字符 memset(cBrand, 0, 49); // 初始化为0 for (DWORD i = 0; i<3; i++) // 依次执行3个指令 { Executecpuid(BRANDID + i); memcpy(cBrand + i*16, &m_eax, 16); // 每次执行结束后,保存四个寄存器里的asc码到数组 } // 由于在内存中,m_eax, m_ebx, m_ecx, m_edx是连续排列 // 所以可以直接以内存的方式进行保存 return string(cBrand); // 以string的形式返回 } 5、检测CPU特(CPU feature) 现在的intel CPU,台式机的好点的都支持Hyper-Threading了,移动的要支持Speed Sted。这些都是CPU的特性。CPU的特性可以通过cpuid获得,参数是eax = 1,返回值放在edx和ecx,通过验证edx或者ecx的某一个bit,可以获得CPU的一个特性是否被支持。比如说,edx的bit 32代表是否支持MMX,edx的bit 28代表是否支持Hyper-Threading,ecx的bit 7代表是否支持speed sted。下面就是获得CPU特性的例子: bool CPUID::IsHyperThreading() // 判断是否支持hyper-threading { Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1 return m_edx & (1<<28); // 返回edx的bit 28 } bool CPUID::IsEST() // 判断是否支持speed step { Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1 return m_ecx & (1<<7); // 返回ecx的bit 7 } bool CPUID::IsMMX() // 判断是否支持MMX { Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1 return m_edx & (1<<23); // 返回edx的bit 23 } CPU的特性还有很多,这只是平时我们听到比较多的三个,更多的特性请参考intel的资料。

② 计算机的CPU怎么看

下载CPU-Z或AIDA64,没有软件系统自带也可以查看

比如CTRL+ALT+DEL 调出任务管理器,看--性能--CPU,在右上显示CPU型号

③ 如何用命令查看cpu型号

首先,打开命令行模式,利用win+r键打开运行,输入cmd回车

然后在命令行界面输入wmic进入命令行系统管理执行脚本界面

然后通过cpu get *可以查看cpu的具体情况(注意空格),拖动滚动条找到numberofcores和numberoflogicalprocessors两列。

由numberofcores可以得知cpu为双核,有numberoflogicalprocessors/numberofcores得知为双线程即超线程,则此cpu为双核超线程。

④ C语言 编程实现获取cpu信息

耐心看看啊,运行通过啦,希望对你有帮助啊!
#include<stdio.h>
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("\
";
}

//得到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("\
";
}

//获得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("\
";
}
void main()
{
getCpuName();
getCpuBrand();
getCpuSeris();
}

⑤ 用C语言怎么得到电脑的CPU序列号,硬盘序列号等信息

获取CPU序列号要使用 汇编指令

比较麻烦

static DWORD g_eax; // 存储返回的eax
static DWORD g_ebx; // 存储返回的ebx
static DWORD g_ecx; // 存储返回的ecx
static DWORD g_edx; // 存储返回的edx

void Executecpuid(DWORD veax)
{
asm("cpuid"
:"=a"(g_eax),
"=b"(g_ebx),
"=c"(g_ecx),
"=d"(g_edx)
:"a"(g_eax));
}
int isSupport;
void GetSerialNumber(WORD nibble[6])
{
Executecpuid(1); // 执行cpuid,参数为 eax = 1
isSupport = g_edx & (1<<18); // edx是否为1代表CPU是否存在序列号
if (FALSE == isSupport) // 不支持,返回false
{
return ;
}
Executecpuid(3); // 执行cpuid,参数为 eax = 3
memcpy(&nibble[4], &g_eax, 4); // eax为最高位的两个WORD
memcpy(&nibble[0], &g_ecx, 8); // ecx 和 edx为低位的4个WORD

}

⑥ C语言(VC++6.0)获取cpu编码

1 要获取CPU编码可以使用dos命令wmic cpu get ProcessorId。

2 要在C语言中执行dos命令,一般使用system("wmic cpu get ProcessorId");

3 由于获取到的cpu编码是打印在命令行中的,要获取结果用system就无法实现了。这时可以用windows提供的_popen函数。该函数的功能为,执行一段dos命令,并将程序运行结果(原本的dos打印)保存在内存中,可以通过文件方式读取。

于是,代码如下:

#include<stdio.h>
#include<stdlib.h>
intmain(void)
{
charpsBuffer[128];
FILE*pPipe;
if((pPipe=_popen("wmiccpugetProcessorId","rt"))==NULL)
exit(1);//执行失败,退出程序。

while(fgets(psBuffer,128,pPipe))//读取结果,并输出。
{
printf(psBuffer);
}


/*关闭执行标识。本质上是释放这段内存。*/
_pclose(pPipe);

return0;
}

⑦ 如何用c语言程序获取计算机信息

开机密码不能获取哦。用户名很简单。只要用个GetUserName这个API就行了。详细的代码我给你看看:

//#include"stdafx.h"
//#include"GetSysInfo.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
CWinApptheApp;
usingnamespacestd;
//获取CPU相关信息
voidGetCPUInfo()
{
CStringCPU;
SYSTEM_INFOsysteminfo;
//获取CPU型号
GetSystemInfo(&systeminfo);
switch(systeminfo.dwProcessorType)
{
casePROCESSOR_INTEL_386://386系列
CPU="PROCESSOR_INTEL_386";
break;
casePROCESSOR_INTEL_486://486系列
CPU="PROCESSOR_INTEL_486";
break;
casePROCESSOR_INTEL_PENTIUM://奔腾系列
CPU="PROCESSOR_INTEL_PENTIUM";
break;
casePROCESSOR_MIPS_R4000:
CPU="PROCESSOR_MIPS_R4000";
break;
casePROCESSOR_HITACHI_SH3:
CPU="PROCESSOR_HITACHI_SH3";
break;
casePROCESSOR_HITACHI_SH4:
CPU="PROCESSOR_HITACHI_SH4";
break;
casePROCESSOR_STRONGARM:
CPU="PROCESSOR_STRONGARM";
break;
casePROCESSOR_ARM720:
CPU="PROCESSOR_ARM720";
break;
default:
CPU="UnknownType";
break;
}
printf(" CPU型号:%s ",CPU);

}
//获取内存信息
voidGetMemoryInfo()
{
CStringMemoryTotal;//总内存大小
CStringMemoryAvail;//可用内存大小


MEMORYSTATUSmemory;
memory.dwLength=sizeof(memory);//初始化
//获取内存信息
GlobalMemoryStatus(&memory);
MemoryTotal.Format(_T("%dMb"),int(memory.dwTotalPhys/1024/1024));
MemoryAvail.Format(_T("%dMb"),int(memory.dwAvailPhys/1024/1024));
printf("主机总内存:%s ",MemoryTotal);
printf("主机可用内存:%s ",MemoryAvail);
}

//获取磁盘信息
voidGetDiskInfo()
{
DWORDsector,byte,cluster,free;
longintfreespace,totalspace;
UINTtype;
charname;
CStringstrname;
//循环检测A~Z,找到磁盘即输出
//0—未知盘、1—不存在、2—可移动磁盘、3—固定磁盘
//4—网络磁盘、5—CD-ROM、6—内存虚拟盘
for(name='A';name<='Z';name++)
{
strname.Format(_T("%c:"),name);
type=GetDriveType(strname);//获得磁盘类型
switch(type)
{
case0:
printf("未知类型磁盘:%s",strname);
break;
case2:
printf("可移动类型磁盘:%s",strname);
break;
case3:
printf("固定磁盘:%s",strname);
break;
case4:
printf("网络映射磁盘:%s",strname);
break;
case5:
printf("光驱:%s",strname);
break;
case6:
printf("内存虚拟磁盘:%s",strname);
break;
default:
break;
}
if(type!=1)
{
//获取磁盘空间信息
GetDiskFreeSpace(strname,&sector,&byte,&free,&cluster);
//磁盘总大小
totalspace=int(cluster)*byte*sector/1024/1024;
//磁盘可用空间大小
freespace=int(free)*byte*sector/1024/1024;
printf("总大小%dMb",totalspace);
printf("可用空间%dMb",freespace);
printf(" ");
}
}

}
int_tmain(intargc,TCHAR*argv[],TCHAR*envp[])
{
intnRetCode=0;

//
if(!AfxWinInit(::GetMoleHandle(NULL),NULL,::GetCommandLine(),0))
{
//TODO:
cerr<<_T("FatalError:MFCinitializationfailed")<<endl;
nRetCode=1;
}
else
{
//TODO:codeyourapplication'sbehaviorhere.
//输出CPU信息
GetCPUInfo();
//输出内存信息
GetMemoryInfo();
//输出磁盘信息
GetDiskInfo();
}

returnnRetCode;
}


其中获取了系统的很多相关信息。像cpu内存硬盘用户名等等。你可以参考一下,呵呵。

⑧ 如何用C语言获取硬盘或主板或CPU的序列号

获取CPU序列号要使用
汇编指令
比较麻烦
static
DWORD
g_eax;
//
存储返回的eax
static
DWORD
g_ebx;
//
存储返回的ebx
static
DWORD
g_ecx;
//
存储返回的ecx
static
DWORD
g_edx;
//
存储返回的edx
void
Executecpuid(DWORD
veax)
{
asm("cpuid"
:"=a"(g_eax),
"=b"(g_ebx),
"=c"(g_ecx),
"=d"(g_edx)
:"a"(g_eax));
}
int
isSupport;
void
GetSerialNumber(WORD
nibble[6])
{
Executecpuid(1);
//
执行cpuid,参数为
eax
=
1
isSupport
=
g_edx
&
(1<<18);
//
edx是否为1代表CPU是否存在序列号
if
(FALSE
==
isSupport)
//
不支持,返回false
{
return
;
}
Executecpuid(3);
//
执行cpuid,参数为
eax
=
3
memcpy(&nibble[4],
&g_eax,
4);
//
eax为最高位的两个WORD
memcpy(&nibble[0],
&g_ecx,
8);
//
ecx

edx为低位的4个WORD
}

⑨ linux下用c语言实现查cpu类型和型号等信息

都在/proc/ 下面
cpu信息在/proc/cpuinfo
启动时间在/proc/uptime 单位是s
/proc/stat 里面有cpu执行的时间,用户态,系统态,空闲都有