Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_лаб_ПЗСУ.doc
Скачиваний:
0
Добавлен:
17.04.2019
Размер:
524.8 Кб
Скачать

Додаток в Використання лічильника тактів для визначення тактової частоти процесора [5]

; Программа

; Использование счетчика тактов для определения

; внутренней тактовой частоты процессора

IDEAL

P386

LOCALS

MODEL MEDIUM

; Подключить файл мнемонических обозначений

; кодов управляющих клавиш

include "lst_2_03.inc"

; Подключить файл мнемонических обозначений цветов

include "lst_2_05.inc"

SEGMENT sseg para stack 'STACK'

DB 400h DUP(?)

ENDS

DATASEG

; Массив для сохранения значений отсчетов счетчика

; тактов в моменты срабатывания системного таймера

qq dd 01234567h

TimeCounter DD 17 DUP(0)

; Разность между соседними замерами

DeltaT DD 16 DUP(?)

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

AverageTime DD ?

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

Time DD ?

; Текстовые сообщения

Text1 DB LIGHTGREEN,0,20

DB "Определение тактовой частоты процессора",0

DB LIGHTGREEN,1,28,"при помощи команды RDTSC",0

DB YELLOW,3,0,"Длительность интервала (тактов):",0

DB YELLOW,20,0,"Средняя длительность интервала:",0

DB YELLOW,22,0

DB "Тактовая частота процессора (МГц):",0

DB LIGHTRED,24,37,"Ждите",0

Text2 DB LIGHTGREEN,24,29,"Нажмите любую клавишу",0

ENDS

CODESEG

;*****************************

;* Основной модуль программы *

;*****************************

PROC ProcFrequency

mov AX,DGROUP

mov DS,AX

; Установить текстовый режим и очистить экран

mov AX,3

int 10h

; Скрыть курсор - убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0

call SetCursorPosition

; Вывести текстовые сообщения на экран

mov CX,6

mov SI,offset Text1

@@NextString:

call ShowColorString

loop @@NextString

; Использовать для вывода чисел белый цвет, черный фон

mov [TextColorAndBackground],WHITE

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

mov AX,0

mov ES,AX

; Инициализировать переменные

mov EAX,[ES:046Ch]

mov [Time],EAX

call WaitTimerStateChange

; Замерить начальные моменты для 17 интервалов

mov BX,17

mov DI,offset TimeCounter

@@t0: call WaitTimerStateChange

;Команда 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

; Из значения счетчика в момент t+1

; вычитаем значение в момент t

@@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

; Отобразить длительность 16 интервалов в тактах

mov BX,16

mov SI,offset DeltaT

mov [ScreenString],4

@@t2: mov [ScreenColumn],0

mov EAX,[SI]

mov [Data_Int32],EAX

call Int32_to_String

call ShowDataString

inc [ScreenString]

add SI,4

dec BX

jnz @@t2

; Отобразить среднюю длительность интервала

mov [ScreenString],20

mov [ScreenColumn],35

mov EAX,[AverageTime]

mov [Data_Int32],EAX

call Int32_to_String

call ShowDataString

; Отобразить тактовую частоту процессора

; Умножить среднее значение на частоту

; генератора системного таймера

mov EAX,[AverageTime]

mov EDX,1193180

mul EDX

; Разделить результат на коэффициент

; пересчета системного таймера (65536)

shrd EAX,EDX,16

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

xor EDX,EDX

mov EBX,1000000

div EBX

;*******************

mov qq,eax

;*******************

; Вывести результат в десятичном коде

mov [Data_Int32],EAX

mov [ScreenString],22

mov [ScreenColumn],35

call Int32_to_String

call ShowDataString

;******************************************************

db 0fh, 31h ;edx eax

mov ebx,qq

; div ebx

; Вывести результат в десятичном коде

mov [Data_Int32],EAX

mov [ScreenString],22

mov [ScreenColumn],35

call Int32_to_String

call ShowDataString

;******************************************************

; Ожидать нажатия любой клавиши

mov SI,offset Text2

call ShowColorString

call GetChar

; Переустановить текстовый режим и очистить экран

mov AX,3

int 10h

; Выход в DOS

mov AH,4Ch

int 21h

ENDP ProcFrequency

;**************************************************

;* ОЖИДАНИЕ ОЧЕРЕДНОГО ИЗМЕНЕНИЯ ЗНАЧЕНИЯ ТАЙМЕРА *

;**************************************************

PROC WaitTimerStateChange near

mov EAX,[Time]

@@T: cmp EAX,[ES:046Ch]

je @@T

mov EAX,[ES:046Ch]

mov [Time],EAX

ret

ENDP WaitTimerStateChange

ENDS

; При выводе на экран длительностей отдельных интервалов и полученной в результате вычислений частоты процессора используется процедура перевода целых чисел из двоичного кода в десятичный. Вспомо­гательная процедура выполняет цикл опроса ячейки па­мяти области данных BIOS, которую системный таймер использует в качестве счетчика тиков (процедура ожидает изменения значения данного счетчика).

; Подключить процедуры вывода данных на экран

include "lst_2_02.inc"

; Подключить процедуры перевода чисел

include "lst_3_05.inc"

END