我不知道这到底是什么代码:
int rdtsc(){
__asm__ __volatile__("rdtsc");拜托有人能解释我吗?为什么是"rdtsc"?
发布于 2014-05-01 06:05:55
实际上,这根本不是很好的代码。
RDTSC是x86指令"ReaD TimeStamp计数器“,它读取一个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周期计数吗?。
发布于 2017-03-09 16:49:02
rdtsc经常被引用的内联程序集会产生gcc-7及更早版本的supeflous代码。
一个更有效的解决方案是使用__builtin_ia32_rdtsc内置函数:
uint64_t tsc = __builtin_ia32_rdtsc();https://stackoverflow.com/questions/23402701
复制相似问题