Кто скажет как частоту процессора определить на асме, не используя rdtsc? Нужен детект на 286-486 моделях, которые эту прекрасную инструкцию не поддерживают. По идее нужно зафиксировать значение таймера, запустить достаточно долгий цикл, снять новое значение таймера. Потом кол-во тактов(затраченных процессором на выполнение цикла), поделить на разность значений таймера до и после. Вся загвоздка в том, что нужно знать кол-во тактов заранее. Вроде есть инструкции, которые выполняются одинаковое кол-во тактов на нужных моделях. Вот только проверить пока негде. Есть у кого какие соображения? Может сталкивались с подобной задачей? Заранее благодарен. ps. Да, кстати, есть исходник, но не могу сообразить как именно идет подсчет финальной частоты, и как алгоритм "подстраивается под определенный процессор. Могу выложить, если кто поможет разгрести.
altcore Есть предложение взять исходники биоса. И посмотреть каким хитро умным способом он определяет частоту для разных моделей процессоров. Или просто считать частоту которую определил БИОС через DMI.
Насчет исходника Биоса: там же, наверное, есть стандартная таблица частот, и он определяет по регистрам процессора. Дай ссылку плз, где можно про определение через DMI почитать. Вот код, который работает, тока я его не совсем догоняю. Может глянет кто его. Я вообще думал взять что-либо наподобие инструкции clc(2 такта на 286-486)-> запустить длительный цикл-> кол-во тактов(которые в теории должен затратить процессор на выполнение цикла)разделить на разность значений таймера до и после. Но нет старой машины, а на моей неадекватный резалт. Мне желателен какой-то более арифметический способ расчета, поменьше спец. инструкций, а то преподша говорит, что за меня все "умные" инструкции делают. ps. И за чем, я ей сказал, что rdtsc держат cpu от p5??? Сдал бы давно и не парился.
altcore Я тут подумал, тебе не подойдет, такое расширение биоса появилось позже. В том исходнике что у тебя идет определение преблизительной частоты за команду взяли деление на 1. div bx - несколько штук. Время мерееться таймиром, перепрограммируемым. Значение округляеться и сравниваеться с таблицей частот. И так несколько попыток.
Это я впринципе сам понял. Но, там таблица для младших процессоров. Эта программа, более-менее точно определяет и для более современных процессоров. Я не понимаю как из кол-ва тиков вычисляем частоту. Мы должны такты делить на время. А на каждом процессоре div bx этот будет разное кол-во тактов выполнятся, соответственно и время будет разное. Там вроде как начальное кол-во тактов задается в ds:si, значение которого считается от модели cpu. потом это значение в ax заносится, и ax раз выполняется цикл внешний цикл, и каждый раз еще 16 внутренний: Code (Text): @@Time_Count_Loop_1: mov cx,10h @@Time_Count_Loop_2: div bx div bx div bx div bx div bx div bx div bx div bx div bx div bx div bx div bx div bx div bx loop @@Time_Count_Loop_2 dec ax jne @@Time_Count_Loop_1 Мне очень нужно понять суть.Там еще в коментариях есть след. Code (Text): ;AX = (число тактов в цикле * частота ;генератора в МГц)/4 = ;= (число тактов в цикле * 1,190МГц)/4 ;DX=0 ;умножение DX:AX на 4 (сдвиг влево на ;на 2 разряда) А откуда берется это самое число тактов? Вот если б из этой программы взять работу с таймером, а цикл другой как-нибудь сделать. Впринципе 2 такта выполняется clc на 286-486, к памяти не обращается. Но у меня что-то с этим не клеится.
altcore вообщемто темо старое, неужто у никого не сохронилось? сам писал и выкладывал на FTp ,правда не под этим ником.
нет не мое. хмм что то старею.поишу с утра должно лежать же де то. если мине память не изменяет у Григорьева в i486 1 или 2,3,4 томе подсмотрел.
_SaNitAr Х.з. ша пытаюсь нарыть этого Григорьева, пока безрезультатно, если есть что у тебя, то кинь в личку
а не проще будет сравнить время выполнения чего-то вроде Code (Text): mov cx, 10000 m: loop m и Code (Text): mov cx, 10000 m: cld loop m после чего частота = 20000 / (t2 - t1), ибо, если не ошибаюсь на всех 286..486 латентность cld - два такта?
leo Ну я же разность считаю... Неясно выразился: я имею ввиду t1 - время выполнения первого цикла t2 - " - " второго цикла именно, чтобы отвязаться от латентностей loop, а то они у 286 - 386 -486 шибко разные... правда я не поручусь, что на всех 286..486, в том числе Cyrix, AMD и прочих латентность cld всегда будет 2. если leo этого не знает, то, наверное, не знает никто