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

Discussion in 'WASM.BEGINNERS' started by altcore, Dec 25, 2006.

  1. altcore

    altcore New Member

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

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

    Pavia Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 17, 2003
    Messages:
    2,409
    Location:
    Fryazino
    altcore
    Есть предложение взять исходники биоса. И посмотреть каким хитро умным способом он определяет частоту для разных моделей процессоров. Или просто считать частоту которую определил БИОС через DMI.
     
  3. altcore

    altcore New Member

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

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

    Pavia Well-Known Member

    Blog Posts:
    0
    Joined:
    Jun 17, 2003
    Messages:
    2,409
    Location:
    Fryazino
    altcore
    Я тут подумал, тебе не подойдет, такое расширение биоса появилось позже.
    В том исходнике что у тебя идет определение преблизительной частоты за команду взяли деление на 1.
    div bx - несколько штук.
    Время мерееться таймиром, перепрограммируемым. Значение округляеться и сравниваеться с таблицей частот. И так несколько попыток.
     
  5. altcore

    altcore New Member

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

    Code (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
    Мне очень нужно понять суть.Там еще в коментариях есть след.

    Code (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

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    ну робято....я ранен ,wasm выведен из строя.
     
  7. altcore

    altcore New Member

    Blog Posts:
    0
    Joined:
    Dec 25, 2006
    Messages:
    22
    Это ты к чему?
     
  8. _SaNitAr

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    altcore

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

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    давай выкладыай, будет любопытно.
     
  10. altcore

    altcore New Member

    Blog Posts:
    0
    Joined:
    Dec 25, 2006
    Messages:
    22
    Если ты про исходник, то он во 2 мое посте.
     
  11. _SaNitAr

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    ммм минут.
     
  12. _SaNitAr

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    нет не мое. хмм что то старею.поишу с утра должно лежать же де то. если мине память не изменяет у Григорьева в i486 1 или 2,3,4 томе подсмотрел.
     
  13. altcore

    altcore New Member

    Blog Posts:
    0
    Joined:
    Dec 25, 2006
    Messages:
    22
    _SaNitAr
    Да, если не внапряг, то посмотри. Буду очень благодарен....
     
  14. _SaNitAr

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    порой кнжки старые, тривиално все. наду скину в личку. давно уж не баловолся с таким.
     
  15. altcore

    altcore New Member

    Blog Posts:
    0
    Joined:
    Dec 25, 2006
    Messages:
    22
    _SaNitAr
    Х.з. ша пытаюсь нарыть этого Григорьева, пока безрезультатно, если есть что у тебя, то кинь в личку
     
  16. _SaNitAr

    _SaNitAr New Member

    Blog Posts:
    0
    Joined:
    Nov 8, 2006
    Messages:
    68
    книга 93 года.
    2х томник. быстрей народ ответит. все равно что фпс считать. все в отпуск туплю.
     
  17. altcore

    altcore New Member

    Blog Posts:
    0
    Joined:
    Dec 25, 2006
    Messages:
    22
    не нашел я ее в электронном виде... Может у кого есть? Залейте на какую файлопомойку..
     
  18. Ustus

    Ustus New Member

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

    leo Active Member

    Blog Posts:
    0
    Joined:
    Aug 4, 2004
    Messages:
    2,542
    Location:
    Russia
    Ustus
    Ага, а латентность loop кто будет учитывать ?! ;))
     
  20. Ustus

    Ustus New Member

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