2016-07-19 6 views
0

Когда я выполнил этот код с b и c переменными, программа выполнит, но не выдаст результат. Существует некоторая логическая ошибка, которая не выводит время на выходе.Ошибка: не удается найти реестр в классе 'AREG' при перезагрузке ASM

__inline__ uint64_t timestamp(void) 
{ 
    unsigned long a, b; 
    asm volatile ("cpuid; rdtscp" : "=a" (a), "=b" (b) : : "%rax", "%rdx"); 
    return a | ((uint64_t) b << 32); 
} 
+1

У вас есть clobbered RAX, поэтому он может использоваться для удовлетворения ограничения '' = a ''. –

+0

В расширенных документах по сборке GCC вы узнаете, как читать таймер с высоким разрешением. Это буквально дает вам код. См. [6.45.2 Расширенные инструкции Asm - Assembler с операндами C Expression] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html) в руководстве. – jww

ответ

1

Как о чем-то вроде:

unsigned int a; 

/* 'volatile' prevents gcc from discarding 'unused' function. */ 
asm volatile ("cpuid" : "=a" (a) : "a" (0): "rbx", "rcx", "rdx"); 

/* Use intrinsics when possible. Ignore 'a', it's garbage. */ 
return __builtin_ia32_rdtscp(&a); 

Хотя я не совсем уверен, почему вам нужно CPUID здесь. Разве rdtscp не ожидает завершения всех предыдущих инструкций? Вы имели в виду использовать cpuid, чтобы проверить, поддерживается ли rdtscp?

+1

Да, это выглядит как хороший способ использовать зависимость, чтобы компилятор поставил CPUID перед RDTSC. Я согласен с тем, что CPUID + RDTSCP выглядит глупо. CPUID + RDTSC является более сильной гарантией переупорядочивания, чем RDTSCP, поэтому, возможно, имеет смысл не всегда использовать RDTSCP, даже когда он доступен. [RDTSCP гарантирует, что предыдущие инструкции были выполнены, но после этого могут начаться инструкции, прежде чем они проведут время.] (Http://www.felixcloutier.com/x86/RDTSCP.html). Таким образом, это не идеально для сериализации в начале измерения, но это нормально для измерения конца временного окна. –

+1

Согласовано. Но, как ни странно, это то, что OP сказал, что они хотят. Вероятно, это означает, что они не совсем уверены, как это работает, поэтому, надеюсь, ваш комментарий поможет разобраться. –