LLVM жалуется на ошибку ассемблера «Неожиданный токен в операнде памяти» - PullRequest
3 голосов
/ 27 сентября 2011

Я выполняю учебное задание для измерения времени доступа к памяти на моей машине. Для определения тактов на наших машинах мы получили следующий фрагмент кода C:

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, используя «Apple LLVM Compiler 2.1»), это дважды приводит к ошибке «Неожиданный токен в операнде памяти» в «\ t» rdtsc соответственно. первая строка инструкции movl.

Я знаю базовый ассемблер, но понятия не имею о формате встроенного ассемблера C.

Кто-нибудь из вас знает, в чем может быть проблема с этим кодом?

Спасибо!

1 Ответ

5 голосов
/ 27 сентября 2011

Предполагая, что это синтаксис встроенной сборки 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");
...