想在QT下使用汇编获取CPU的厂家,使用了VC的代码,但是无法通过.求教高手如何在QT下使用汇编
- C/C++ code
__asm__{ mov eax,0 cpuid mov DWORD PTR OEMString,ebx mov DWORD PTR OEMString+4,edx mov DWORD PTR OEMString+8,ecx mov BYTE PTR OEMString+12,0 }
hardwareinformation.cpp:47: 错误:expected '(' before '{' token
hardwareinformation.cpp:48: 错误:'mov' was not declared in this scope
hardwareinformation.cpp:48: 错误:expected ';' before 'eax'
------解决方案--------------------
unsigned long s1,s2,s3,s4;
char string[128];
char szCpuId[1024];
char p1[128], p2[128];
unsigned int eax = 0;
unsigned int ebx,ecx,edx;
QString strCPUID;
#if 1
asm volatile
(
"cpuid"
: "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx)
: "0"(0)
);
snprintf(szCpuId, 5, "%s", (char *)&ebx);
//printf((char*)szCpuId);
//printf("11\n");
snprintf(szCpuId+4, 5, "%s", (char *)&edx);
//printf((char*)szCpuId);
//printf("22\n");
snprintf(szCpuId+8, 5, "%s", (char *)&ecx);
//printf((char*)szCpuId);
//printf("33\n");
#endif
asm volatile
(
"movl $0x01 , %%eax ; \n\t"
"xorl %%edx , %%edx ;\n\t"
"cpuid ;\n\t"
"movl %%edx ,%0 ;\n\t"
"movl %%eax ,%1 ; \n\t"
:"=m"(s1),"=m"(s2)
);
char cpuID[20];
memset(cpuID,0,20);
sprintf((char *)p1, "%08X%08X", s1, s2);
snprintf(szCpuId+12, 20, "%s", (char *)p1);
memcpy(cpuID,p1,17);
strCPUID = strCPUID.fromAscii(cpuID);
//printf("=========\n");
//printf((char*)cpuID);
//printf("=========\n");
//printf((char*)szCpuId);
//printf("44\n");
asm volatile
(
"movl $0x03,%%eax ;\n\t"
"xorl %%ecx,%%ecx ;\n\t"
"xorl %%edx,%%edx ;\n\t"
"cpuid ;\n\t"
"movl %%edx,%0 ;\n\t"
"movl %%ecx,%1 ;\n\t"
:"=m"(s3),"=m"(s4)
);
sprintf((char *)p2, "%08X-%08X\n", s3, s4);
snprintf(szCpuId+31, 19, "%s", (char *)p2);
//printf((char*)szCpuId);
//printf("55\n");
//printf((char*)szCpuId);
return strCPUID;
我是这样用的,在WINDOWS和LINUX上可以编译过
------解决方案--------------------
用gcc编译时用AT&T汇编而不是X86汇编