函数__asm__ __volatile __(“rdtsc”);

时间:2014-05-01 05:47:33

标签: c++ x86 rdtsc

我不知道这段代码究竟是什么:

int rdtsc(){
    __asm__ __volatile__("rdtsc");

拜托,有人可以解释一下吗?为什么“rdtsc”?

2 个答案:

答案 0 :(得分:6)

实际上,根本不是很好的代码。

RDTSC是x86指令" ReaD TimeStamp Counter" - 它读取一个64位计数器,在处理器的每个时钟周期计数。

但由于它是64位数字,它存储在EAX(低部分)和EDX(高部分)中,并且如果此代码曾被用于在内联的情况下,编译器不知道EDX正在被破坏。或者内联程序集在从非void函数结束之前设置EAX。

编译器没有理解"汇编程序代码,它是一个黑盒子,你必须用输入/输出操作数描述它,所以它知道EDX:EAX中有一个输出。 (或EAX中的输出EDX被破坏)。我会这样做:

uint64_t rdtsc()
{
   uint32_t hi, lo;
   __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
   return ( (uint64_t)lo)|( ((uint64_t)hi)<<32 );
}

因此给出了一个时间计数,它不会在现代机器上每隔一两秒回绕一次,并告诉编译器注册了asm语句修改的内容。

或者使用__rdtsc()内在函数让编译器自己发出rdtsc指令,并知道输出的位置。请参阅Get CPU cycle count?

答案 1 :(得分:4)

rdtsc经常引用的内联汇编产生supeflous code with gcc-7 and earlier versions

更有效的解决方案是使用__builtin_ia32_rdtsc内置函数:

uint64_t tsc = __builtin_ia32_rdtsc();