2011-09-27 2 views
3

내 컴퓨터에서 메모리 액세스 시간을 측정하기 위해 연구 과제를 수행하고 있습니다. 가 우리의 기계에 클럭 사이클을 결정하기 위해, 우리는 다음과 같은 C 조각 주어졌다 :이 ("애플 LLVM 컴파일러 2.1"을 사용하여 엑스 코드 4) 컴파일 할 때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"); 
} 

를,이 두 번 발생 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

관련 문제