VS2012支持__asm__ __volatile__汇编程序代码

时间:2016-03-08 18:01:57

标签: c++ visual-studio-2012 assembly

我正在使用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);

如果出现以下错误,则此程序集无法编译:

error C2065: '__asm__' : undeclared identifier

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

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

这也不起作用,导致:

error C2400: inline assembler syntax error in 'opcode'; found '('

帮助解决这个问题。

2 个答案:

答案 0 :(得分:5)

如果你坚持使用cpuid,你应该使用#include <intrin.h> void foo() { uint32_t registers[4]; __cpuid(registers, 1); unsigned CPUFeatureSet = registers[3]; // ... } 内在函数。 this甚至带有示例代码。像这样:

=LOOKUP(DATE(2016,5,$P6), Table1[Date], Table1[Paper Name])

答案 1 :(得分:2)

您可以使用提供的API查询当前计算机的体系结构,包括处理器和核心数以及NUMA体系结构。