__asm__ in C ++ error

I am trying to read cpuid information with the following cod, but it does not work. I am using Visual Studio 2010:

#include "stdafx.h" #include <stdio.h> int main() { int a, b; for (a = 0; a < 5; a++) { __asm__("cpuid" :"=a"(b) // EAX into b (output) :"0"(a) // a into EAX (input) :"%ebx","%ecx","%edx"); // clobbered registers printf("The code %i gives %i\n", a, b); } return 0; } 

Here is what he says:

 'project_scs.exe': Loaded 'C:\Users\rares992\Documents\Visual Studio 2010\Projects\project_scs\Debug\project_scs.exe', Symbols loaded. 'project_scs.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Symbols loaded (source information stripped). 'project_scs.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Symbols loaded (source information stripped). 'project_scs.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Symbols loaded (source information stripped). 'project_scs.exe': Loaded 'C:\Windows\SysWOW64\msvcp100d.dll', Symbols loaded. 'project_scs.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded. The thread 'Win32 Thread' (0x2190) has exited with code -1073741510 (0xc000013a). The program '[8828] project_scs.exe: Native' has exited with code -1073741510 (0xc000013a). 

Can anyone say what to do to run? Thanks

+3
c ++ assembly visual-studio-2010 cpuid
source share
2 answers

The main problem: you used the AT & T syntax that is used for GCC. However, Visual Studio needs Intel syntax. Take a look at my next example and look at its links:

 #include <stdio.h> #include <intrin.h> #define EAX 0 #define EBX 1 #define ECX 2 #define EDX 3 int main ( void ) { int exx[4], a; // http://msdn.microsoft.com/en-us/library/4ks26t93%28v=vs.100%29.aspx puts ("Using VC inline assembler:"); for (a = 0; a < 5; a++) { __asm { xor ecx, ecx // needed for a=4 mov eax, a cpuid mov exx[EAX], eax } printf("The code %i gives %08X\n", a, exx[EAX]); } // http://msdn.microsoft.com/en-us/library/vstudio/hskdteyh%28v=vs.100%29.aspx puts ("Using VC intrinsics:"); for (a = 0; a < 5; a++) { __cpuid(exx, a); printf("The code %i gives %08X\n", a, exx[EAX]); } return 0; } 
+1
source share

Here is what I use. It should work with MSVC, ICC, GCC and Clang.

 static inline void cpuid (int output[4], int functionnumber) { #if defined (_MSC_VER) || defined (__INTEL_COMPILER) // Microsoft or Intel compiler, intrin.h included __cpuidex(output, functionnumber, 0); // intrinsic function for CPUID #elif defined(__GNUC__) || defined(__clang__) // use inline assembly, Gnu/AT&T syntax int a, b, c, d; __asm("cpuid" : "=a"(a),"=b"(b),"=c"(c),"=d"(d) : "a"(functionnumber),"c"(0) : ); output[0] = a; output[1] = b; output[2] = c; output[3] = d; #else // unknown platform. try inline assembly with masm/intel syntax __asm { mov eax, functionnumber xor ecx, ecx cpuid; mov esi, output mov [esi], eax mov [esi+4], ebx mov [esi+8], ecx mov [esi+12], edx } #endif } 
+1
source share

All Articles