- •Методичні рекомендації і контрольні завдання до виконання лабораторних робіт
- •Лабораторна робота № 1
- •1. Теоретичні відомості
- •2. Порядок виконання лабораторної роботи.
- •3. Контрольні питання
- •Лабораторна робота №2
- •1. Теоретичні відомості
- •2. Порядок виконання лабораторної роботи.
- •3. Контрольні питання
- •Лабораторна робота № 3 Системні функції для роботи з пристроями вводу інформації в системах управління
- •1. Теоретичні відомості
- •1.1. Апаратна реалізація пристроїв введення інформації
- •1.2. Введення даних із клавіатури
- •1.3. Системна підтримка клавіатури
- •1.4. Контролер клавіатури
- •Призначення регістрів контролера клавіатури
- •2. Порядок виконання лабораторної роботи.
- •3. Контрольні питання
- •Лабораторна робота № 4
- •1. Теоретичні відомості
- •Значения бітів порта 61h
- •2. Порядок виконання лабораторної роботи.
- •3. Контрольні питання
- •Перелік літератури
- •Додаток а
- •Додаток б Короткий опис команд отладчика
- •Додаток в Використання лічильника тактів для визначення тактової частоти процесора [5]
- •Додаток г Засоби виводу на екран
- •Додаток з введення даних із клавіатури
- •Додаток е інтерфейс клавіатури
- •Додаток і Використання убудованого динамику
Додаток в Використання лічильника тактів для визначення тактової частоти процесора [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