Определение частоты без rdtsc

Тема в разделе "WASM.BEGINNERS", создана пользователем altcore, 25 дек 2006.

  1. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    Кто скажет как частоту процессора определить на асме, не используя rdtsc? Нужен детект на 286-486 моделях, которые эту прекрасную инструкцию не поддерживают.
    По идее нужно зафиксировать значение таймера, запустить достаточно долгий цикл, снять новое значение таймера. Потом кол-во тактов(затраченных процессором на выполнение цикла), поделить на разность значений таймера до и после. Вся загвоздка в том, что нужно знать кол-во тактов заранее. Вроде есть инструкции, которые выполняются одинаковое кол-во тактов на нужных моделях. Вот только проверить пока негде. Есть у кого какие соображения? Может сталкивались с подобной задачей?
    Заранее благодарен.

    ps. Да, кстати, есть исходник, но не могу сообразить как именно идет подсчет финальной частоты, и как алгоритм "подстраивается под определенный процессор. Могу выложить, если кто поможет разгрести.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    altcore
    Есть предложение взять исходники биоса. И посмотреть каким хитро умным способом он определяет частоту для разных моделей процессоров. Или просто считать частоту которую определил БИОС через DMI.
     
  3. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    Насчет исходника Биоса: там же, наверное, есть стандартная таблица частот, и он определяет по регистрам процессора.
    Дай ссылку плз, где можно про определение через DMI почитать.
    Вот код, который работает, тока я его не совсем догоняю. Может глянет кто его. Я вообще думал взять что-либо наподобие инструкции clc(2 такта на 286-486)-> запустить длительный цикл-> кол-во тактов(которые в теории должен затратить процессор на выполнение цикла)разделить на разность значений таймера до и после. Но нет старой машины, а на моей неадекватный резалт. Мне желателен какой-то более арифметический способ расчета, поменьше спец. инструкций, а то преподша говорит, что за меня все "умные" инструкции делают.

    ps. И за чем, я ей сказал, что rdtsc держат cpu от p5??? Сдал бы давно и не парился.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    altcore
    Я тут подумал, тебе не подойдет, такое расширение биоса появилось позже.
    В том исходнике что у тебя идет определение преблизительной частоты за команду взяли деление на 1.
    div bx - несколько штук.
    Время мерееться таймиром, перепрограммируемым. Значение округляеться и сравниваеться с таблицей частот. И так несколько попыток.
     
  5. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    Это я впринципе сам понял. Но, там таблица для младших процессоров. Эта программа, более-менее точно определяет и для более современных процессоров.
    Я не понимаю как из кол-ва тиков вычисляем частоту. Мы должны такты делить на время. А на каждом процессоре div bx этот будет разное кол-во тактов выполнятся, соответственно и время будет разное. Там вроде как начальное кол-во тактов задается в ds:si, значение которого считается от модели cpu. потом это значение в ax заносится, и ax раз выполняется цикл внешний цикл, и каждый раз еще 16 внутренний:

    Код (Text):
    1. @@Time_Count_Loop_1:
    2.         mov cx,10h
    3.  
    4. @@Time_Count_Loop_2:
    5.         div bx
    6.         div bx
    7.         div bx
    8.         div bx
    9.         div bx
    10.         div bx
    11.         div bx
    12.         div bx
    13.         div bx
    14.         div bx
    15.         div bx
    16.         div bx
    17.         div bx
    18.         div bx
    19.         loop    @@Time_Count_Loop_2
    20.  
    21.         dec ax
    22.         jne @@Time_Count_Loop_1
    Мне очень нужно понять суть.Там еще в коментариях есть след.

    Код (Text):
    1.                                           ;AX = (число тактов в цикле * частота
    2.                     ;генератора в МГц)/4 =
    3.                     ;= (число тактов в цикле * 1,190МГц)/4
    4.                             ;DX=0
    5.                             ;умножение DX:AX на 4 (сдвиг влево на
    6.                             ;на 2 разряда)
    А откуда берется это самое число тактов?
    Вот если б из этой программы взять работу с таймером, а цикл другой как-нибудь сделать. Впринципе 2 такта выполняется clc на 286-486, к памяти не обращается. Но у меня что-то с этим не клеится.
     
  6. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    ну робято....я ранен ,wasm выведен из строя.
     
  7. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    Это ты к чему?
     
  8. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    altcore

    вообщемто темо старое, неужто у никого не сохронилось?
    сам писал и выкладывал на FTp ,правда не под этим ником.
     
  9. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    давай выкладыай, будет любопытно.
     
  10. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    Если ты про исходник, то он во 2 мое посте.
     
  11. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    ммм минут.
     
  12. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    нет не мое. хмм что то старею.поишу с утра должно лежать же де то. если мине память не изменяет у Григорьева в i486 1 или 2,3,4 томе подсмотрел.
     
  13. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    _SaNitAr
    Да, если не внапряг, то посмотри. Буду очень благодарен....
     
  14. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    порой кнжки старые, тривиално все. наду скину в личку. давно уж не баловолся с таким.
     
  15. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    _SaNitAr
    Х.з. ша пытаюсь нарыть этого Григорьева, пока безрезультатно, если есть что у тебя, то кинь в личку
     
  16. _SaNitAr

    _SaNitAr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    68
    книга 93 года.
    2х томник. быстрей народ ответит. все равно что фпс считать. все в отпуск туплю.
     
  17. altcore

    altcore New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2006
    Сообщения:
    22
    не нашел я ее в электронном виде... Может у кого есть? Залейте на какую файлопомойку..
     
  18. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    а не проще будет сравнить время выполнения чего-то вроде
    Код (Text):
    1.    mov   cx, 10000
    2. m: loop m
    и
    Код (Text):
    1.    mov   cx, 10000
    2. m: cld
    3.    loop m
    после чего частота = 20000 / (t2 - t1), ибо, если не ошибаюсь на всех 286..486 латентность cld - два такта?
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ustus
    Ага, а латентность loop кто будет учитывать ?! ;))
     
  20. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    leo
    Ну я же разность считаю...
    Неясно выразился: я имею ввиду
    t1 - время выполнения первого цикла
    t2 - " - " второго цикла
    именно, чтобы отвязаться от латентностей loop, а то они у 286 - 386 -486 шибко разные...
    правда я не поручусь, что на всех 286..486, в том числе Cyrix, AMD и прочих латентность cld всегда будет 2. :dntknw:
    если leo этого не знает, то, наверное, не знает никто :)