-------------------------
cpuid.h文件
-------------------------
#ifndef CPUID_H
#define CPUID_H
#include<iostream>
#include<string>
#include<memory.h>
#include<QString>
using namespace std;
#define SET_BIT(bit) (1UL<<bit)
#define CLR_BIT(bit) (~(1UL<<bit))
/*定义寄存器结构*/
typedef struct regStruct{ unsigned long int eax,ebx,ecx,edx; }Reg,*pReg;
class CPUID
{
public:
static CPUID *Instance();
void GetSerialNumber();
private:
Reg cpuID(unsigned long op);
static CPUID * m_pInstance;
QString ltos(unsigned long int num);
};
#endif // CPUID_H
-------------------------
cpudid.cpp文件
-------------------------
#include "cpuid.h"
CPUID* CPUID::m_pInstance = NULL;
CPUID * CPUID::Instance()
{
if (NULL == m_pInstance)
{
m_pInstance = new CPUID();
}
return m_pInstance;
}
Reg CPUID::cpuID(unsigned long op)
{
Reg r;
asm("cpuid;"
:"=a"(r.eax),
"=b"(r.ebx),
"=c"(r.ecx),
"=d"(r.edx)
:"a"(op)
);
return r;
}
void CPUID::GetSerialNumber(){
Reg r;
unsigned short int cpu_sn[6]; //存储序列号
QString sn;
int i;
r=this->cpuID(1);
memcpy((&cpu_sn) + 4, &r.eax, 4);
printf("CPU序列号是:%X-%X\n",r.edx,r.ecx);
if(r.edx & (1<<18))
{
r=this->cpuID(3);
memcpy((&cpu_sn) + 0, &r.ecx, 8);
for(i=5;i>=0;i--)
{
printf("%x",cpu_sn);
if(i) printf("-");
}
}
}
QString CPUID::ltos(unsigned long int num)
{
QString s=QString("");
char numchar;
do{
numchar=char(int('0')+(int)(num));
s=numchar+s;
num=num/10;
}while(num>0);
return(s);
}
--------------------------
main.cpp
-------------------------
#include<iostream>
#include "cpuid.h"
int main(){
CPUID::Instance()->GetSerialNumber();
string s;
return 0;
}
程序执行到
if(r.edx & (1<<18))
{
r=this->cpuID(3);
memcpy((&cpu_sn) + 0, &r.ecx, 8);
for(i=5;i>=0;i--)
{
//sn+=this->ltos(cpu_sn);
//sn+=cpu_sn
printf("%x",cpu_sn);
if(i) printf("-");
}
}
就跳过了.
查看了下英文帮助文档:
To determine if the processor serial number feature is supported, the program should set
the EAX register parameter value to “1” and then execute the CPUID instruction as
follows:
MOV EAX, 01H
CPUID
After execution of the CPUID instruction, the ECX and EDX register contains the Feature
Flags. If the PSN Feature Flags, (EDX register, bit 18) equals “1”, the processor serial
number feature is supported, and enabled. If the PSN Feature Flags equals “0”, the
processor serial number feature is either not supported, or disabled in a
Pentium III processor.
我的机子是cpu是奔腾双核T2390,环境Ubuntu 9.04+QT 4,CPU序列号无法取出来,快疯了,请高手帮忙看看,不胜感激。