感谢你们的帮助,我得到了我的小内联汇编程序,几乎就是我想要它的地方。然而,现在似乎发生了一些与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
帮助将不胜感激!
答案 0 :(得分:5)
rdtsc
会使用tick计数器的部分覆盖eax
和edx
。自从您lea
加载timings
到edx
之前的rdtsc
地址rdtsc
后,您的计划功能就会混乱。您可以将eax
移到命令链的上方,也可以使用edx
和{{1}}以外的寄存器来执行程序。
答案 1 :(得分:0)
除了明显的RDTSC写入EDX问题之外,您没有为 asm 语句提交clobber列表。 GCC假定您在代码执行后未在任何位置列出的每个寄存器都保持不变,并且可以使用这些寄存器在代码中保留一些值。在GCC文档中查找语法,因为我不记得了:)。