c++ - ARM 中是否有与 rdtsc 等效的指令?

标签 c++ c assembly arm inline-assembly

对于我的项目我必须使用内联汇编指令例如rdtsc来计算一些C/C++指令的执行时间。

以下代码似乎适用于 Intel 但不适用于 ARM 处理器:

{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);}
//The C++ statement to measure its execution time
{unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);}
time = t1-t0;

我的问题是:

如何编写与上述类似的内联汇编代码(计算指令的执行耗时)以在 ARM 处理器上运行?

最佳答案

您应该读取协处理器 p15PMCCNTR 寄存器(不是真正的协处理器,只是 CPU 函数的入口点)以获得周期计数.请注意,只有在以下情况下,它才可用于非特权应用:

  1. 允许非特权PMCCNTR 读取:

    PMUSERENR 寄存器的位 0 必须设置为 1 ( official docs )

  2. PMCCNTR 实际上是在计数周期:

    PMCNTENSET 寄存器的位 31 必须设置为 1 ( official docs )

这是 a real-world example它是如何完成的。

关于c++ - ARM 中是否有与 rdtsc 等效的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454157/

相关文章:

c - 如何在 OSX Sierra 上安装 gcc 4.2.1?

assembly - 目标代码与机器代码

c++ - 在可移植应用程序中包含外星人,C++

c - 如何创建一个 `static` 大小为零且没有 calloc 的常量数组?

sql - 如何将日期从德语格式转换为英语格式?

assembly - Assembly 的 Makefile 使用隐式规则而不是显式规则

assembly - mov %eax,(%esp)

c++ - C++中的全局类

c++ - wglDeleteContext 访问冲突

c++ - MAP 文件分析——我的代码大小从何而来?