Nable писал(а):
В общем, например, для переключения задач и тому подобного очень удобен local APIC timer.
Почитаю документацию
Nable писал(а):
откуда такое увлечение асмом там где можно обойтись без него, да ещё и в вырвиглазном синтаксисе? Есть же inline asm (правда, тут тоже может понадобиться AT&T, но писанины хотя бы меньше)
Тут мое имхо:
1. "Железные" особенности вынуждают использовать ассемблер. Что касается синтаксиса - дело вкуса и я например не считаю его вырвиглазным, а считаю удобным. К тому же GAS хорошо без допнастройки интегрирован со всеми средствами разработки в среде *nix. И если есть горячее желание использовать Intel-синтаксис - пожалуйста, есть директивы
.intel_syntax noprefix, которые допускается применять в том числе и в ассемблерных вставках
2. По поводу ассемблерных вставок. Реализуйте приведенный в стартовом сообщении кусок кода с применением asm volatile(...), выполните сборку и посмотрите дизасcемблерный листинг. Сколько отсебятины добавит gcc в ваш ассемблерный код? И как эта отсебятина повлияет потом на работу реализуемой функции? У меня было
такое. По-моему проще и быстрее написать объектный модуль на чистом асме (если он требуется реально), выкинув в заголовок прототип внешней функции и получить детерминированный результат, а инлайн ассемблер оставить для случаев когда необходимо выполнить одну-две команды. К тому же asm volatil-ы затрудняют чтение кода, ибо ужасны на вид эти заборы скобок и кавычек с равенствами и двоеточиями.
Используя ассемблерные вставки мы уже используем ассемблер. Зачем притворятся что мы типо пишем на С, если код истыкан asm volatile в больших количествах? Получается не проще а сложнее - несколько *.s файлов не испортят картины, а только придадут коду ясность и структурированность.
Add: Вот "безассемблерная" реализация той же функции что и в стартовом посте
Код:
/*------------------------------------------------------------------------------
//
//----------------------------------------------------------------------------*/
void get_cpu_ticks2(u64int* ticks)
{
u32int lo = 0;
u32int hi = 0;
asm volatile ("rdtsc":"=a"(lo),"=d"(hi));
*ticks = hi;
*ticks = *ticks << 32;
*ticks |= lo;
}
Вот дизассеблерный листинг того что получается без оптимизации
С оптимизацией ключем -O2 не отличается от ассемблерной реализации get_cpu_ticks(...), которая внизу скрина
М-да, интересный результат... Но все же, не очевидный