-1

我不知道这段代码到底是做什么的:

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

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

4

2 回答 2

9

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

RDTSC是 x86 指令“Read TimeStamp Counter”——它读取一个 64 位计数器,该计数器在处理器的每个时钟周期都向上计数。

但由于它是一个 64 位数字,它存储在EAX(low part) 和EDX(high part) 中,并且如果该代码曾经在内联的情况下使用,编译器不知道它EDX正在被破坏。或者内联程序集在脱离非void函数的末尾之前设置 EAX。

编译器不“理解”汇编代码,它是一个黑盒子,你必须用输入/输出操作数来描述它,所以它知道EDX:EAX. (或被破坏的输出EAXEDX。我会这样做:

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指令,并知道输出在哪里。请参阅获取 CPU 周期计数?.

于 2014-05-01T06:05:55.973 回答
5

经常被引用的内联汇编使用 gcc-7 和更早版本rdtsc生成多余的代码。

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

uint64_t tsc = __builtin_ia32_rdtsc();
于 2017-03-09T16:49:02.947 回答