• 4031阅读
  • 1回复

取不到处理器的序列号,请大家帮我看看哪错了!! [复制链接]

上一主题 下一主题
离线ankoe
 
只看楼主 倒序阅读 楼主  发表于: 2009-06-05
-------------------------
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序列号无法取出来,快疯了,请高手帮忙看看,不胜感激。
离线ankoe
只看该作者 1楼 发表于: 2009-06-05
够郁闷的,跑了几个论坛,都没人解决得了。
快速回复
限100 字节
 
上一个 下一个