CPU序列號是一個建立在處理器內部的、唯一的、不能被修改的編號。它由96位數字組成。高32位是CPU ID,用來識別CPU類型。低64位每個處理器都不同,唯一地代表了該處理器。CPU號可以用來識別每一個處理器。為了適應這一新特征,Intel在處理中增加了兩條指令(“讀取”和“禁止”)和一個寄存器位(模式指定寄存器位:Model Specific Register一“MSR”)。讀取指令擴展了CPUID讀取指令。當執行讀取指令時可以得到96位的處理器序列號。禁止指令可以禁止對處理器序列號的讀取。為了配合CPU序列號的讀取和禁止,設置了MSR位。當MSR位為“0”時可以讀取CPU序列號;當MSR為“1”時只能讀取高32位(即CPU ID)而低64位全為零,只能通過reset CPU才能啟用MSR。
實現代碼:
void CWaterSaveDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知處理程序代碼
unsigned long s1,s2;
unsigned char vendor_id[]="------------";//CPU提供商ID
CString str1,str2,str3;
// 以下為獲得CPU ID的匯編語言指令
_asm // 得到CPU提供商信息
{
xor eax,eax // 將eax清0
cpuid // 獲取CPUID的指令
mov dword ptr vendor_id,ebx
mov dword ptr vendor_id[+4],edx
mov dword ptr vendor_id[+8],ecx
}
str1.Format("CPU提供商ID:%s",vendor_id);
_asm // 得到CPU ID的高32位
{
mov eax,01h
xor edx,edx
cpuid
mov s2,eax
}
str2.Format("%08X-",s2);
_asm // 得到CPU ID的低64位
{
mov eax,03h
xor ecx,ecx
xor edx,edx
cpuid
mov s1,edx
mov s2,ecx
}
str3.Format("%08X-%08X\n",s1,s2);
str2="CPU序列號:" + str2 + str3;
MessageBox(str2);
}