VS2012支持__asm__ __volatile__汇编代码

Men*_*des 1 c++ assembly visual-studio-2012

我正在使用VS2012 C++ Windows 7,我需要获取有关CPU多线程的信息,以计算可用逻辑处理器的数量.

我正在使用此代码(来自This SO Post)

typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;

uint32_t registers[4];
__asm__ __volatile__ ("cpuid " :
                      "=a" (registers[0]),
                      "=b" (registers[1]),
                      "=c" (registers[2]),
                      "=d" (registers[3])
                      : "a" (1), "c" (0));

unsigned CPUFeatureSet = registers[3];
bool hyperthreading = CPUFeatureSet & (1 << 28);
Run Code Online (Sandbox Code Playgroud)

鉴于以下错误,此程序集无法编译:

error C2065: '__asm__' : undeclared identifier
Run Code Online (Sandbox Code Playgroud)

我尝试过更改__asm __volatile并将所有内容放在一行中:

__asm __volatile ("cpuid " :   "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3])  : "a" (1), "c" (0));
Run Code Online (Sandbox Code Playgroud)

这也不起作用,导致:

error C2400: inline assembler syntax error in 'opcode'; found '('
Run Code Online (Sandbox Code Playgroud)

帮助赞赏解决这个问题.

Jes*_*ter 5

如果你坚持使用cpuid,你应该使用__cpuid()内在函数.该MSDN网页甚至带有示例代码.像这样的东西:

#include <intrin.h>

void foo()
{
    uint32_t registers[4];
    __cpuid(registers, 1);
    unsigned CPUFeatureSet = registers[3];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要获得需要"ECX"中的子函数的CPUID扩展,那么还有一个`__cpuidex``. (2认同)