當前位置:首頁 » 編程語言 » 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執行的時間,用戶態,系統態,空閑都有