错误:重新加载ASM时无法在类“AREG”中找到寄存器

时间:2016-07-19 03:47:04

标签: gcc assembly inline-assembly rdtsc

当我用bc变量执行此代码时,程序将执行但不生成输出。存在一些逻辑错误,它不会在输出中打印时间。

__inline__ uint64_t timestamp(void)
{
   unsigned long a, b;
   asm volatile ("cpuid; rdtscp" : "=a" (a), "=b" (b) : : "%rax", "%rdx");
   return a | ((uint64_t) b << 32);
}

1 个答案:

答案 0 :(得分:1)

如下:

unsigned int a;

/* 'volatile' prevents gcc from discarding 'unused' function.  */
asm volatile ("cpuid" : "=a" (a) : "a" (0): "rbx", "rcx", "rdx");

/* Use intrinsics when possible.  Ignore 'a', it's garbage.  */
return __builtin_ia32_rdtscp(&a);

虽然我不太清楚为什么你需要cpuid。 rdtscp是否已经等待所有先前的指令完成?你的意思是使用cpuid检查并查看是否支持rdtscp?