C内联汇编中的RDTSC导致分段错误!

时间:2009-05-27 06:07:48

标签: c assembly segmentation-fault

感谢你们的帮助,我得到了我的小内联汇编程序,几乎就是我想要它的地方。然而,现在似乎发生了一些与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

帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

rdtsc会使用tick计数器的部分覆盖eaxedx。自从您lea加载timingsedx之前的rdtsc地址rdtsc后,您的计划功能就会混乱。您可以将eax移到命令链的上方,也可以使用edx和{{1}}以外的寄存器来执行程序。

答案 1 :(得分:0)

除了明显的RDTSC写入EDX问题之外,您没有为 asm 语句提交clobber列表。 GCC假定您在代码执行后未在任何位置列出的每个寄存器都保持不变,并且可以使用这些寄存器在代码中保留一些值。在GCC文档中查找语法,因为我不记得了:)。