2016-08-29 13 views
1

Я пытаюсь скомпилировать this c source file с помощью cl.exe (из Visual Studio). Конкретный код в вопрос, который не может скомпилировать это:Скомпилировать источник c директивой 'asm'

#include <stdio.h> 

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, 
           unsigned int *ecx, unsigned int *edx) 
{ 
     /* ecx is often an input as well as an output. */ 
     asm volatile("cpuid" 
      : "=a" (*eax), 
       "=b" (*ebx), 
       "=c" (*ecx), 
       "=d" (*edx) 
      : "0" (*eax), "2" (*ecx)); 
} 

Я вижу эту ошибку:

C:\>cl sgx.c 
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24213.1 for x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

sgx.c 
sgx.c(7): error C2065: 'asm': undeclared identifier 
sgx.c(7): error C2143: syntax error: missing ';' before 'volatile' 
+3

Похоже, что gcc расширенный встроенный asm. Я не думаю, что VS это может понять. Используйте другой компилятор. – EOF

+1

Вы пробовали '__asm' вместо' asm'? –

+3

Это, похоже, расширенный встроенный ассемблер GCC, который несовместим с MSVC. В MSVC теперь есть встроенный компилятор '__cpuid': https://msdn.microsoft.com/en-us/library/hskdteyh.aspx. Я бы конвертировал вашу функцию 'cpuid', чтобы использовать встроенный вместо встроенного ассемблера. –

ответ

2

Вместо прямого монтажа, вы можете использовать встроенные функции компилятора. Microsoft компиляторы поддержки __cpuid() описываемые здесь: https://msdn.microsoft.com/en-us/library/hskdteyh.aspx

GCC вместо поддерживает __get_cpuid() через cpuid.h, как описано этот ответ (https://stackoverflow.com/a/14266932/1401351).