RDTSC в линейной сборке C вызывает ошибку сегментации! - PullRequest
3 голосов
/ 27 мая 2009

Благодаря некоторой помощи вам, ребята, я получил мою маленькую встроенную программу ассемблера почти там, где я хочу, чтобы она была. Однако теперь, кажется, что-то очень странное происходит с командой 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 ]

5 голосов
/ 27 мая 2009

rdtsc заменяет eax и edx на части счетчика тиков. Поскольку вы загрузили (lea) адрес timings на edx ранее rdtsc, это нарушает работу вашей программы. Вы можете переместить rdtsc вверх по цепочке команд или использовать регистры, отличные от eax и edx, для работы вашей программы.

0 голосов
/ 03 июля 2009

Помимо очевидной проблемы записи RDTSC в EDX, вы не отправили список клоббера для оператора asm . GCC предполагает, что каждый регистр, который вы нигде не перечислите как выходной / закрывающий, остается неизменным после выполнения вашего кода, и может использовать эти регистры для сохранения некоторых значений в вашем коде. Посмотрите синтаксис в документации GCC, поскольку я не помню его:).

...