2011-09-27 24 views
3

我正在做一项研究任务以测量我机器上的内存访问时间。 要确定我们的机器时钟周期,我们一直在下面的C代码片段:LLVM抱怨汇编错误“内存操作数中的意外令牌”

static inline void getcyclecount(uint64_t* cycles) 
{ 
    __asm __volatile(
        "cpuid   # force all previous instruction to complete\n\t" 
        "rdtsc   # TSC -> edx:eax \n\t" 
        "movl %%edx, 4(0) # store edx\n\t" 
        "movl %%eax, 0(0) # store eax\n\t" 
        : : "r"(cycles) : "eax", "ebx", "ecx", "edx"); 
} 

然而,当我尝试编译这个(的XCode 4,使用“苹果LLVM编译器2.1”),它会导致两次在rdtsc resp的“\ t”中出现错误“内存操作数中的意外令牌”。第一个movl指令行。

我知道基本的汇编程序,但不知道C内联汇编程序格式。

有没有人知道可能是这个代码的问题?

谢谢!

回答

5

假设这是GCC内联汇编语法,你错过了在存储器的操作数%

__asm __volatile(
       "cpuid   # force all previous instruction to complete\n\t" 
       "rdtsc   # TSC -> edx:eax \n\t" 
       "movl %%edx, 4(%0) # store edx\n\t" 
       "movl %%eax, 0(%0) # store eax\n\t" 
       : : "r"(cycles) : "eax", "ebx", "ecx", "edx"); 
+0

超级真棒!固定它,非常感谢你! – Patrick