Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4828493
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-09-15 14:52:25

#include <stdio.h>
 
typedef struct {
    unsigned int eax;
    unsigned int edx;
    unsigned int ecx;
} cpusn_t;
 
int get_cpusn(cpusn_t *sn)
{
    sn->eax = 1;
    __asm__ (
        "cpuid\n\t"
        :"=c"(sn->ecx), "=d"(sn->edx), "=a" (sn->eax)
        :"2" (sn->eax)
    );
    if ((sn->edx & (1<<17)) == 0)
        return 1;
 
    sn->eax = 3;
    __asm__ (
        "cpuid\n\t"
        :"=c"(sn->ecx), "=d"(sn->edx), "=a" (sn->eax)
        :"2" (sn->eax)
    );
    return 0;
}
void print_cpusn(cpusn_t sn)
{
    char buf[30];
    snprintf(buf, sizeof(buf), "%04X-%04X-%04X-%04X-%04X-%04X",
        sn.eax>> 16, sn.eax & 0xffff,
        sn.edx>> 16, sn.edx & 0xffff,
        sn.ecx>> 16, sn.ecx & 0xffff);
    printf("%s\n", buf);
 
}
 
int main(void)
{
    cpusn_t sn = {0, 0, 0};
    if (get_cpusn(&sn) == 0) {
        print_cpusn(sn);
    } else {
        //printf("edx = %x\n", sn.edx);

        printf("Doesn't support this.\n");
    }
    return 0;
}

阅读(1111) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~