Ожидается выражение в выражении `__asm`

Я использую код из эта тема форума чтобы получить информацию о семействе 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.

Если да, то какие заголовки / библиотеки мне не хватает?
Если нет, что я делаю не так?

1

Решение

В вашем примере кода используется встроенный синтаксис в стиле GCC, который не поддерживается компилятором Microsoft. Хотя у Microsoft есть собственный встроенный синтаксис сборки, вам следует избегать его использования везде, где это возможно. Он поддерживается только 32-разрядным компилятором x86, он не поддерживается 64-разрядным компилятором или компиляторами, предназначенными для AMD или других архитектур ЦП. Кроме того, в отличие от встроенного синтаксиса сборок GCC, синтаксис Microsoft является предметом ряда недокументированных правил, и даже если он написан «правильно», он может быть очень хрупким.

В вашем случае вы должны использовать встроенную функцию Microsoft для CPUID инструкция. Он будет работать как с 32-битными, так и с 64-битными версиями компилятора и не сломается, потому что вы изменили уровни оптимизации или обновили свой компилятор. Конкретная функция, которую вы хотите использовать, __cpuid. Связанная документация должна прояснить, как вы можете использовать его для замены встроенного оператора сборки в вашем cpuid функция.

1

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


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