Visual Studio 2010 — __asm__ в C ++ ошибка

Я пытаюсь прочитать информацию cpuid с помощью следующего кода, но он не работает. Я использую 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;
}

Вот что это говорит:

'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).

Может кто-нибудь сказать, что нужно сделать, чтобы он работал? Спасибо

4

Решение

Вот что я использую. Он должен работать с MSVC, ICC, GCC и 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
}
2

Другие решения

Основная проблема: вы использовали AT&Синтаксис T, как он используется для GCC. Тем не менее, Visual Studio нуждается в синтаксисе Intel. Посмотрите на мой следующий пример и посмотрите на ссылки в нем:

#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

По вопросам рекламы [email protected]