Лабораторная работа №64 / FREQ1
.doc
; Использование счетчика тактов для определения
; тактовой частоты процессора
.8086
include "c:\masm61\include\dos.inc"
seg data public 'data'
; Начальное значение счетчика тактов
StartTSC DD ?
val DD ?
result dd 13 dup (0)
; Текстовые сообщения
Txt1 DB "Определение тактовой частоты "
DB "процессора при помощи команды RDTSC",0
Txt2 DB "Тактовая частота процессора (МГц):",0
TxtW DB "Ждите ...",0
AnyK DB "Нажмите любую клавишу",0
ends
seg code public para 'code'
assume cs:code, ds:data
;*****************************
;* Основной модуль программы *
;*****************************
proc ProcFrequency
.386
mov AX,DGROUP
mov DS,AX
; Установить текстовый режим и очистить экран
mov AX,3
int 10h
; Скрыть курсор - убрать за нижнюю границу экрана
@SetCsrPos 90,10
; Вывести текстовые сообщения на экран
@ShowStr Txt1
@ShowStr Txt2
@ShowStr TxtW
; Настроить сегментный регистр ES на область данных BIOS
mov AX,0
mov ES,AX
; Запомнить текущее время
mov EAX,[ES:046Ch]
; Ожидать изменения состояния системного таймера
@@T0: cmp EAX,[ES:046Ch]
je @@T0
; Запомнить значение счетчика тиков
DB 0Fh,31h ;команда RDTSC
mov [StartTSC],EAX
; Запомнить начальное значение системного времени
mov EAX,[ES:046Ch]
; Ожидать в течение 8 тиков
add EAX,8
@@T1: cmp EAX,[ES:046Ch]
ja @@T1
; Получить конечное значение счетчика тиков
DB 0Fh,31h ;команда RDTSC
; Вычислить среднюю длительность интервала
; (число тактов в одном тике)
sub EAX,[StartTSC]
shr EAX,3 ;деление на 8
; Определить тактовую частоту процессора
; Умножить длительность интервала на частоту
; генератора системного таймера
mov EDX,1193180
mul EDX
; Разделить результат на коэффициент
; пересчета системного таймера (65536)
shrd EAX,EDX,16
; Вычислить частоту в МГц (разделить на 1000000)
xor EDX,EDX
mov EBX,1000000
div EBX
; Вывести результат в десятичном коде
mov val,EAX
mov ecx,12
lable:
mov edx,0
mov ebx,10
div ebx
add dl,"0"
mov [result+12-ecx],dl
loop lable
@ShowStr "result"
; Ожидать нажатия любой клавиши
@ShowStr AnyK
@GetChar
; Переустановить текстовый режим и очистить экран
mov AX,3
int 10h
; Выход в DOS
mov AH,4Ch
.8086
int 21h
ENDP ProcFrequency
ENDS
END ProcFrequency