ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c – 在gcc的内联汇编程序中出错[复制]

2019-10-08 08:06:40  阅读:175  来源: 互联网

标签:c assembly intel clock


参见英文答案 > How to get the CPU cycle count in x86_64 from C++?                                    4个
我已经成功地在gcc中编写了一些内联汇编程序来向右旋转一位
遵循一些很好的指示:http://www.cs.dartmouth.edu/~sergey/cs108/2009/gcc-inline-asm.pdf

这是一个例子:

static inline int ror(int v) {
    asm ("ror %0;" :"=r"(v) /* output */ :"0"(v) /* input */ );
    return v;
}

但是,我希望代码能够计算时钟周期,并且看到了一些错误的(可能是微软)格式.我不知道如何在gcc中做这些事情.有帮助吗?

unsigned __int64 inline GetRDTSC() {
   __asm {
      ; Flush the pipeline
      XOR eax, eax
      CPUID
      ; Get RDTSC counter in edx:eax
      RDTSC
   }
}

我试过了:

static inline unsigned long long getClocks() {
    asm("xor %%eax, %%eax" );
    asm(CPUID);
    asm(RDTSC : : %%edx %%eax); //Get RDTSC counter in edx:eax

但我不知道如何让edx:eax对以干净的方式返回64位,并且不知道如何真正冲洗管道.

另外,我找到的最佳源代码是:http://www.strchr.com/performance_measurements_with_rdtsc

那是提到奔腾,所以如果有不同的方式在不同的英特尔/ AMD变种上做,请告诉我.我更喜欢适用于所有x86平台的东西,即使它有点难看,也适用于每种变体的一系列解决方案,但我不介意了解它.

解决方法:

以下是您想要的:

inline unsigned long long rdtsc() {
  unsigned int lo, hi;
  asm volatile (
     "cpuid \n"
     "rdtsc" 
   : "=a"(lo), "=d"(hi) /* outputs */
   : "a"(0)             /* inputs */
   : "%ebx", "%ecx");     /* clobbers*/
  return ((unsigned long long)lo) | (((unsigned long long)hi) << 32);
}

在代码中放置尽可能少的内联ASM非常重要,因为它会阻止编译器进行任何优化.这就是为什么我在C代码中完成了结果的转换和结果,而不是在ASM中进行编码.类似地,我使用0的“a”输入让编译器决定何时以及如何将eax归零.可能是程序中的某些其他代码已将其清零,编译器可以保存指令,如果它知道的话.

此外,上面的“clobbers”非常重要. CPUID覆盖eax,ebx,ecx和edx中的所有内容.您需要告诉编译器您正在更改这些寄存器,以便它知道不要在那里保留任何重要内容.您不必列出eax和edx,因为您将它们用作输出.如果你没有列出clobbers,那么你的程序很可能会崩溃,你会发现追踪问题非常困难.

标签:c,assembly,intel,clock
来源: https://codeday.me/bug/20191008/1870932.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有