首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在`__asm`语句中期望一个表达式

在`__asm`语句中期望一个表达式
EN

Stack Overflow用户
提问于 2014-09-07 14:28:43
回答 1查看 3.3K关注 0票数 1

我使用来自本论坛主题的代码来获取CPU的家庭信息:

代码语言:javascript
运行
复制
#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 2013给出了该行的“InteliSense: expected表达式”错误:

代码语言:javascript
运行
复制
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 2013告诉我的那样,我将error C2290: C++ 'asm' syntax ignored. Use __asm.更改为__asm

我遇到的每一个错误都与上面的代码块相关:

代码语言:javascript
运行
复制
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早期版本中的所需的库或头。

如果是这样的话,我遗漏了哪些头/库?如果没有,我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-07 15:12:44

示例代码使用GCC风格的内联程序集语法,Microsoft编译器不支持这种语法。虽然Microsoft有自己的内联程序集语法,但您应该尽可能避免使用它。它只支持32位x86编译器,不受64位编译器或编译器的支持,因为这些编译器或编译器获取AMD或其他CPU体系结构。与GCC的内联程序集语法不同的是,微软的语法受制于一些无文档的规则,即使写得“正确”也可能非常脆弱。

在您的情况下,您应该使用微软的内在功能作为CPUID指令。它将同时适用于32位和64位版本的编译器,并且不会因为您更改优化级别或升级编译器而中断。您希望使用的特定函数是__cpuid。链接的文档应该说明如何使用它替换cpuid函数中的内联程序集语句。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25711263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档