当前位置: 代码迷 >> QT开发 >> Qt下怎么使用汇编
  详细解决方案

Qt下怎么使用汇编

热度:108   发布时间:2016-04-25 04:42:10.0
Qt下如何使用汇编
想在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汇编
  相关解决方案