“__asm”语句中应包含表达式
Expected an expression in `__asm` statement
我使用论坛主题中的代码来获取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 %un",
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或其他CPU架构的编译器。此外,与GCC的内联汇编语法不同,微软的语法受到许多未记录的规则的约束,即使写得"正确",也可能非常脆弱。
在您的情况下,您应该将Microsoft的内在函数用于CPUID
指令。它将同时适用于32位和64位版本的编译器,不会因为您更改了优化级别或升级了编译器而中断。您要使用的特定函数是__cpuid
。链接的文档应该清楚地说明如何使用它来替换cpuid
函数中的内联汇编语句。
相关文章:
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 正则表达式,包含名称 + "string" + 数字,没有其他内容
- 带有自动initializer_list包含多个表达式
- 一次包含一个 #include 表达式的多个头文件?
- C++:分析包含表达式的字符串"access to the multidimensinal array"
- 如何构建包含C 11的恒定表达式的代码
- 检查字符串是否包含有效的后缀表达式
- C++ 包含表达式的初始化列表
- C++包含返回的宏表达式(如 Rust 的尝试!
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头
- 如何为字符串编写正则表达式,其中包含一个数字至少一个数字,并且不包含任何字母
- 采用向量中包含的唯一指针的 Lambda 表达式
- 修改正则表达式以包含反斜杠和单引号(以便反斜杠表现为转义字符)
- 包含 comptime 断言的整数常量表达式宏
- 表达式包含未展开的参数包
- 表达式包含不匹配的括号
- C++Bare布尔表达式(不包含if、while或其他语句)
- 包含循环作为表达式的宏
- “__asm”语句中应包含表达式