Я использую код из эта тема форума чтобы получить информацию о семействе CPU:
#include <stdio.h>
struct cpuid_type {
unsigned int eax;
unsigned int ebx;
unsigned int ecx;
unsigned int edx;
};
typedef struct cpuid_type cpuid_t;
cpuid_t cpuid(unsigned int number)
{
cpuid_t result;
__asm("movl %4, %%eax; cpuid; movl %%eax, %0; movl %%ebx, %1; movl %%ecx, %2; movl %%edx, %3;": "=m" (result.eax),
"=m" (result.ebx),
"=m" (result.ecx),
"=m" (result.edx) /* output */
: "r" (number) /* input */
: "eax", "ebx", "ecx", "edx" /* no changed registers except output registers */
);
return result;
}
int main (int argc, const char * argv[])
{
cpuid_t cpuid_registers;
unsigned int cpu_family, cpu_model, cpu_stepping;
cpuid_registers = cpuid(1);
cpu_family = 0xf & (cpuid_registers.eax>>8);
cpu_model = 0xf & (cpuid_registers.eax>>4);
cpu_stepping = 0xf & cpuid_registers.eax;
printf("CPUID (1): CPU is a %u86, Model %u, Stepping %u\n",
cpu_family, cpu_model, cpu_stepping);return 0;
}
Однако Visual Studio 2013 выдает ошибку «InteliSense: ожидалось выражение» для этой строки:
asm("movl %4, %%eax; cpuid; movl %%eax, %0; movl %%ebx, %1; movl %%ecx, %2; movl %%edx, %3;": "=m" (result.eax), // <-- Error Here
"=m" (result.ebx),
"=m" (result.ecx),
"=m" (result.edx) /* output */
: "r" (number) /* input */
: "eax", "ebx", "ecx", "edx" /* no changed registers except output registers */
);
Как Visual Studio 2013 сказал мне, что error C2290: C++ 'asm' syntax ignored. Use __asm.
, Я изменился asm
в __asm
,
Каждая ошибка, которая у меня есть, связана с вышеуказанным блоком кода:
5 IntelliSense: expected a ')'
Error 2 error C2290: C++ 'asm' syntax ignored. Use __asm.
Error 1 error C2143: syntax error : missing ')' before ':'
Error 3 error C2059: syntax error : ')'
Поскольку я буквально использую код, предоставленный из упомянутой выше ветки, без каких-либо изменений (кроме __asm
изменить), я предполагаю, что я не включаю необходимую библиотеку или заголовок, который не нужно включать в более ранние версии Visual Studio.
Если да, то какие заголовки / библиотеки мне не хватает?
Если нет, что я делаю не так?
В вашем примере кода используется встроенный синтаксис в стиле GCC, который не поддерживается компилятором Microsoft. Хотя у Microsoft есть собственный встроенный синтаксис сборки, вам следует избегать его использования везде, где это возможно. Он поддерживается только 32-разрядным компилятором x86, он не поддерживается 64-разрядным компилятором или компиляторами, предназначенными для AMD или других архитектур ЦП. Кроме того, в отличие от встроенного синтаксиса сборок GCC, синтаксис Microsoft является предметом ряда недокументированных правил, и даже если он написан «правильно», он может быть очень хрупким.
В вашем случае вы должны использовать встроенную функцию Microsoft для CPUID
инструкция. Он будет работать как с 32-битными, так и с 64-битными версиями компилятора и не сломается, потому что вы изменили уровни оптимизации или обновили свой компилятор. Конкретная функция, которую вы хотите использовать, __cpuid
. Связанная документация должна прояснить, как вы можете использовать его для замены встроенного оператора сборки в вашем cpuid
функция.