IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Тактовая частота процессора, как её определять?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 28
Пол: Мужской

Репутация: -  0  +


Объясните как определить тактовую частоту процессора(uses tasm под консоль), лучше кодом. Долго искал, ничего путнего не нашел.


--------------------
Плагины для FL Studio и Pro Tools
Учусь на ошибках компилятора...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Вот так я делал, когда надо было определять частоту в Асм-модуле, а использовать значение в Паскале:
IDEAL 
P386
LOCALS
MODEL small

SEGMENT sseg para stack 'STACK'
DB 200h DUP (?)
ENDS

DATASEG
; Частота процессора (переменная описана в Паскаль-программе)
EXTRN CPU_Freq:DWORD;

; Массив для сохранения значений отсчетов счетчика
; тактов в моменты срабатывания системного таймера
TimeCounter DD 17 DUP(?)

; Разность между соседними замерами
DeltaT DD 16 DUP(?)

; Среднее значение длительности интервала
AverageTime DD ?

; Предыдущее значение системного таймера
Time DD ?
ENDS

CODESEG
; к этой процедуре нам необходим доступ из Паскаля
PUBLIC Frequency

PROC Frequency
MOV AX, DGROUP
MOV DS, AX

; Настроить сегментный регистр ES на область данных BIOS
MOV AX, 0
MOV ES, AX

; Инициализировать переменные
MOV EAX, [ES:046Ch]
MOV [Time], EAX

; Процедура, ожидающая изменения таймера
CALL WaitTimer

; Замерить начальные моменты для 17 интервалов
MOV BX, 17
MOV DI, offset TimeCounter
@@t0: CALL WaitTimer

; Команда RDTSC
DB 0Fh, 31h

MOV [DI], EAX
ADD DI, 4
DEC BX
JNZ @@t0

; Вычислить длительность 16 интервалов в тактах
MOV BX, 16
MOV DI, offset TimeCounter
MOV SI, offset DeltaT
MOV EDX, 0

@@t1: MOV EAX, [DI+4]
SUB EAX, [DI]
MOV [SI], EAX
ADD EDX, EAX ;накопление суммы значений
ADD DI, 4
ADD SI, 4
DEC BX
JNZ @@t1
; Вычислить среднюю длительность интервала
SHR EDX, 4 ; деление на 16
MOV [AverageTime], EDX

; Умножить среднее значение на частоту генератора системного таймера
MOV EAX, [AverageTime]
MOV EDX, 1193180
MUL EDX

; Разделить результат на коэффициент пересчета системного таймера 65536
SHRD EAX, EDX,16

; Вычислить частоту в МГц (разделить на 1000000)
XOR EDX, EDX
MOV EBX, 1000000
DIV EBX

; Частота процессора переносится в CPU_Freq
MOV [CPU_Freq], EAX

; Возвращаемся из процедуры
RET
ENDP Frequency

; Процедура, ожидающая изменения таймера
PROC WaitTimer near
MOV EAX, [Time]
@@T: CMP EAX, [ES:046Ch]
JE @@T
MOV EAX,[ES:046Ch]
MOV [Time],EAX
RET
ENDP WaitTimer

ENDS
END
Кое-что поправить, и можно будет работать только с Асм-ом... Справишься?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.05.2024 1:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name