Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2010, 15:57   #1
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию цикл на определённое время

Подскажите как сделать цикл на определённое время, например секунд на 10? Это хочу сделать что бы найти частоту процессора. Т.е. внутри цикла сделать только увеличение счётчика на единицу, потом после цикла поделить счётчик на время и получить среднее значение тактов в секунду.
Или может есть какой-нибудь другой способ узнать частоту процессора?
Nitrino вне форума Ответить с цитированием
Старый 07.01.2010, 17:19   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Вот, что интел говорит про определение частоты:
Цитата:
To determine the operating frequency of the processor, software performs the following steps.
The assembly language program frequenc.asm (see Example 8) demonstrates the frequency
detection algorithm.
1. Execute the CPUID instruction with an input value of EAX=0 and ensure the vendor-ID
string returned is “GenuineIntel”.
2. Execute the CPUID instruction with EAX=1 to load the EDX register with the feature flags.
3. Ensure that the TSC feature flag (EDX bit 4) is set. This indicates the processor supports the
Time-Stamp Counter and RDTSC instruction.
4. Read the TSC at the beginning of the reference period.
5. Read the TSC at the end of the reference period.
6. Compute the TSC delta from the beginning and ending of the reference period.
7. Compute the actual frequency by dividing the TSC delta by the reference period.
Actual frequency = (Ending TSC value – Beginning TSC value) / reference period
В процессорах Transmeta можно получить частоту процессора при помощи команды cpuid
А засечь промежуток времени можно при помощи таймера, правда в ДОС и винде это делается разными способами.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 12.01.2010, 12:27   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Nitrino
Вот так можно узнать частоту CPU под DOS'ом, впрочем запущенная COM-программа правильно выдает частоту и под WinXP
Код:
.model tiny
.586
.code
org 100h
start:	push 0; Настроить сегментный регистр GS на область данных BIOS
        pop gs
        mov ebx,gs:[046Ch]; Инициализировать переменную Time
        call WaitTimer; Процедура, ожидающая изменения таймера
; Замерить начальные моменты для 17 интервалов
        mov cx,17
        mov edi,offset TimeCounter
@@:	call WaitTimer
        rdtsc
        stosd;mov     es:[eDI],eax
        dec cx
        jnz @b
; Вычислить длительность 16 интервалов в тактах
        mov bx,16
        mov esi,offset TimeCounter
        xor edx,edx            
@@:     lodsd; Из значения счетчика в момент t
        sub eax,[esi]; вычитаем значение в момент t+1   
        sub edx,eax ;накопление суммы значений
        dec bx
        jnz @b
; Вычислить среднюю длительность интервала
;        shr edx,4   ;деление на 16
        mov eax,edx
; Умножить среднее значение на частоту генератора системного таймера
        mov edx,1193180/16
        mul edx
; Разделить результат на коэффициент пересчета системного таймера 65536
        shrd eax,edx,16       
; Вычислить частоту в МГц (разделить на 1000000)
        ;xor     EDX,EDX
        ;mov     EBX,1000000       
        ;div     EBX      
	mov ebx,10      
	mov edi,offset buffer+10
@@:     xor edx,edx                    
	div ebx               
	add dl,'0'
	mov [edi],dl                 
	dec edi
	test eax,eax;cmp eax,0                
	jne @b
        mov ah,9
	mov dx,offset msg; Отобразить тактовую частоту процессора
	int 21h
        ret; Выход в DOS
; Процедура, ожидающая изменения таймера
WaitTimer proc near
@@:     cmp ebx,gs:[46Ch]; Предыдущее значение системного таймера
        je @b
        mov ebx,gs:[46Ch]
        ret
WaitTimer endp
TimeCounter DD 17 DUP(?); Массив для сохранения значений отсчетов счетчика
; тактов в моменты срабатывания системного таймера
msg db 'CPU FREQUENCY: '
buffer db 11 dup ('0'),' Hz$'; Частота процессора
END start
Mikl___ вне форума Ответить с цитированием
Старый 12.01.2010, 13:57   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Nitrino
Во вложении программа, в которой я пытался разными способами узнать частоту процессора. Написано для WinXP. Под Win95/98, Win2k и Vista не пойдет.
Вложения
Тип файла: rar mtut_39.rar (5.0 Кб, 16 просмотров)
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл, время выполнения шага KiDoki Общие вопросы Delphi 9 19.12.2008 22:37
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34
Как создать событие(которое выполняется в определённое время) micaell Общие вопросы Delphi 5 13.12.2006 18:35