【发布时间】:2018-07-08 05:25:10
【问题描述】:
CPUID 可以用作序列化指令,如here 和here 所述。在 C++ 中以这种方式使用它的最小/最简单的 asm 语法是什么?
// Is that enough?
// What to do with registers and memory?
// Is volatile necessary?
asm volatile("CPUID":::);
【问题讨论】:
-
从技术上讲,您根本不能这样做,因为内联汇编是标准 C++ 中不存在的编译器特定的东西。虽然我们可以猜测您最有可能使用哪个编译器,但在询问有关内联汇编的问题时始终包含该信息。还提到目标 ISA 通常是个好主意,即使在这种情况下也可以猜到。
-
使用内置而不是 asm。
cpuid覆盖寄存器,至少您需要将eax,ebx,ecx和edx列为 clobbers。是的,volatile是必需的。 -
#include <intrin.h>并使用__cpuid()函数。 -
你需要它做什么?
-
如果需要序列化
rdtsc,使用lfence。英特尔保证它可以工作(至少在英特尔 CPU 上)。见stackoverflow.com/questions/38994549/…。 (不过,on AMD it seems you needmfenceinstead oflfence,所以cpuid显然更便携)