函数 __asm__ __volatile__( "rdtsc" );

Function __asm__ __volatile__("rdtsc");

本文关键字:rdtsc asm volatile 函数      更新时间:2023-10-16

我不知道这个代码到底是什么:

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

有人能解释一下吗?为什么是"rdtsc"?

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

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

rdtsc的常被引用的内联程序集使用gcc-7和早期版本生成了出色的代码。

更有效的解决方案是使用__builtin_ia32_rdtsc内置功能:

uint64_t tsc = __builtin_ia32_rdtsc();