首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数__asm__ __volatile__("rdtsc");

函数__asm__ __volatile__("rdtsc");
EN

Stack Overflow用户
提问于 2014-05-01 05:47:32
回答 2查看 6.5K关注 0票数 1

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

代码语言:javascript
复制
int rdtsc(){
    __asm__ __volatile__("rdtsc");

拜托有人能解释我吗?为什么是"rdtsc"?

EN

回答 2

Stack Overflow用户

发布于 2014-05-01 06:05:55

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

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

但是由于它是64位数字,所以它存储在EAX (低部分)和EDX (高部分)中,如果在内联的情况下使用这段代码,编译器就不知道EDX遭到了破坏。或者内联程序集在从非void函数结束之前设置EAX。

编译器并不“理解”汇编程序代码,它是一个黑匣子,您必须用输入/输出操作数来描述它,以便它知道EDX:EAX中有一个输出。(或者是EAX中的一个输出,EDX被击穿了)。我会这么做:

代码语言:javascript
复制
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周期计数吗?

票数 9
EN

Stack Overflow用户

发布于 2017-03-09 16:49:02

rdtsc经常被引用的内联程序集会产生gcc-7及更早版本的supeflous代码

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

代码语言:javascript
复制
uint64_t tsc = __builtin_ia32_rdtsc();
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23402701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档