![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
guf |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Объясните как определить тактовую частоту процессора(uses tasm под консоль), лучше кодом. Долго искал, ничего путнего не нашел.
-------------------- Плагины для FL Studio и Pro Tools
Учусь на ошибках компилятора... |
![]() ![]() |
volvo |
![]()
Сообщение
#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
Кое-что поправить, и можно будет работать только с Асм-ом... Справишься? |
guf |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо большое, volvo. Только у меня один вопрос - как использоавть в своей программе 64-битные регистры?
У меня TASM ругается на них, пишет типа "undefineid symbol eax". -------------------- Плагины для FL Studio и Pro Tools
Учусь на ошибках компилятора... |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата как использоавть в своей программе 64-битные регистры? У меня TASM ругается на них, пишет типа "undefineid symbol eax". ![]() Цитата(Console) G:\Asm30>tasm /z/zi/l freq Turbo Assembler Version 3.0 Copyright © 1988, 1991 Borland International Assembling file: freq.ASM Error messages: None Warning messages: None Passes: 1 Remaining memory: 419k |
guf |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Упс, значит не 64 бита
![]() Вот например: Код TITLE SystemRevision JUMPS .model SMALL .data;описание данных ... .code .8086 start: mov AX,@DATA ; установка в ds адpеса mov DS, AX ; сегмента данных ... mov EAX, [ES:046Ch] .... end start В итоге: Код Turbo Assembler Version 4.1 10/11/08 21:38:11 Page 21 Error Summary SystemRevision mov eax,10h **Error** System.asm(93) Undefined symbol: EAX Не понимаю почему нельзя работать с EAX, EDX и т.п. -------------------- Плагины для FL Studio и Pro Tools
Учусь на ошибках компилятора... |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата Не понимаю почему нельзя работать с EAX, EDX и т.п. Ну ты ж сам запретил:Цитата .code
.8086 ; <--- Вот тут
|
guf |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо, все отлично работает теперь!
Ты случайно не знаешь как узнать название процессора? Оно вроде где-то в памяти хранится... -------------------- Плагины для FL Studio и Pro Tools
Учусь на ошибках компилятора... |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 20:24 |