在你们的帮助下,我几乎在我想要的地方有了我的小型内联汇编程序。但是,现在rdtsc命令似乎发生了一些非常奇怪的事情。基本上,我在调用它时遇到了分段错误。

int timings[64*N];
int main(void)
{

    int i;

    __asm__ __volatile__ (
       "lea edx, [timings] \n\t"
       "rdtsc \n\t"
       ".rept 32 \n\t"
       "mov eax,[edx] \n\t"
       "inc eax \n\t"
       "mov dword ptr [edx], eax \n\t"
       "add edx, 4 \n\t"
       ".endr \n\t"
    :
    : [timings] "m" (*timings)
   );

   for(i=0; i<32; i++)
      printf("%d\n", timings[i]);

   return 0;
}


省略rdtsc,然后程序进行编译并执行应做的事情。但是添加rdtsc行会导致分段错误。我正在双核计算机上运行这些东西并用于编译:gcc -masm = intel test.c

帮助将不胜感激!

最佳答案

rdtsc用滴答计数器的部分覆盖eaxedx。自从您将(cc)的地址加载到(cc)之前的lea中以来,timings弄乱了程序的功能。您可以将edx移到命令链的上方,也可以将rdtscrdtsc以外的寄存器用于程序运行。

10-08 00:35