Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ассемблер. Учебное пособие

..pdf
Скачиваний:
178
Добавлен:
02.05.2014
Размер:
557.54 Кб
Скачать

адрес самой таблицы списка списков возвращается функцией 52h прерывания Int 21h.

3. В блоке описания файлов (59 байт) по смещению 0Bh находится номер первого кластера файла.

4. Полученный номер первого кластера инсталляционная программа записывает в сегмент данных рабочей программы.

Рабочая программа после запуска всегда выполняетет одну операцию: определяет номер своего первого кластера и сравнивает его с записанным. Если числа не совпадают, то выполняется аварийное завершение.

Другой применяемый метод заключается в записи ключа за логическими пределами файла. Известно, что DOS выделяет место файлу целыми кластерами, в результате чего за логическим концом файла практически всегда есть свободное место до конца кластера. При копировании файла на другой диск реально переносятся только байты, соответствующие файлу, а байты последнего кластера файла, находящиеся за логическим концом файла, не копируются. Если в них записать ключ, то он при копировании исчезнет.

33

3. Служба времени

Служба времени предназначена для введения системного и реального времени в персональный компьютер, а также оказания дополнительных услуг. Соответственно служба времени аппаратно поддерживается с помощью двух различных компонентов ПК: счетчика системного времени и часов реального времени RTC.

3.1. Счетчик системного времени

Основой счетчика системного времени является программируемый интервальный таймер i8254 (рис. 3.1).

 

 

 

К0

 

ШД

 

 

 

OUT

 

БШД

 

РР

 

 

 

 

 

 

РНУ

GATE

 

 

ВШД

 

 

 

 

 

WR

 

 

 

CLK

 

 

 

 

RD

СУВВ

 

ВС

 

 

 

 

CS

 

 

 

 

A0

 

 

РВ3

 

A1

 

 

 

 

 

 

 

 

 

 

K1

OUT

 

 

 

 

 

 

 

 

GATE

 

 

 

 

CLK

 

 

 

K2

OUT

 

 

 

GATE

 

 

 

 

 

 

 

 

CLK

Рис.3.1. Программируемый интервальный таймер i8254

В состав таймера входят: буфер шины данных (БШД), схема управления вводом-выводом (СУВВ) и три независимых канала (К0, К1 и К2), каждый из которых содержит регистр режима (РР), регистр начального установки (РНУ), регистр фиксации выходного значения (РВЗ) и 16-разрядный вычитающий счетчик (ВС). Обмен информацией с центральным процессором осуществляется через буфер шины данных БШД по 8-битной шине ШД. Перед обменом ЦП (центральный процессор) активизирует таймер с помощью сигнала CS и указывает направление обмена (RD=0 – чтение, WR=0 – запись).

34

Комбинация сигналов адреса А1 и А0 выбирает канал таймера или регистр режима заданного канала (00 – канал 0, 01 – канал 1, 10 – канал 2, 11 – регистр режима ).

Программирование канала счетчика осуществляется путем вывода управляющего байта в его регистр режима РР и 16-битного начального значения в регистр начальной установки РНУ. Управляющий байт имеет следующий формат:

в разрядах D6-D7 указывается номер канала (каждый канал программируется независимо своим управляющим байтом): 00

– канал 0, 01 – канал 1, 10 – канал 2;

разряды D4-D5 определяют вид загрузки счетчика: 01 – обмен только с младшим байтом счетчика, 10 – только со старшим байтом, 11 – обмен с двумя байтами. При комбинации 00 текущее состояние счетчика фиксируется в регистре фиксации выходного значения РВЗ. Это позволяет читать значение счетчика, не останавливая его работы (режим «чтение на лету»);

разряды D3-D1 задают номер режим работы канала счетчика : 000 – режим 0, 001 – режим 1, 010 – режим 2 и т.д.;

разряд D0 – задает режим двоичного (D0=0) или двоичнодесятичного счета (D0=1).

Каждый канал имеет два входа: GATE и CLK, а также один выход OUT. На вход CLK подаются тактовые импульсы от внешнего генератора, задающие скорость работы счетчика (максимальная частота не более 2 МГц). Вход GATE разрешает работу канала, а с выхода OUT снимаются выходные сигналы, которые могут быть использованы для управления внешними устройствами.

После программирования канала таймера и записи в его регистр начальной установки некоторого значения счетчика он может работать в одном из следующих шести режимов (рис.3.2):

Режим 0 (прерывание терминального счета). После записи

управляющего байта

в регистр режима

канала

на

выходе

ОUT устанавливается

напряжение низкого уровня. Загрузка

счетчика не изменяет

это состояние.

Затем

начинается

декремент счетчика (последовательное

вычитание из

него

единицы). В момент, когда счетчик обнулится, на выходе OUT

устанавливается напряжение высокого уровня и

сохраняется

до загрузки счетчика новым значением. Счет возможен только

35

при наличии сигнала высокого уровня на входе GATE. Низкий уровень этого сигнала или ниспадающий фронт запрещают счет. Перезагрузка счетчика во время счета приводит к следующему: загрузка младшего байта останавливает текущий счет, загрузка старшего байта запускает новый цикл счета. Минимально допустимое значение счетчика равно 2.

CLK

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

WR

 

 

N=5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GATE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

реж0

 

 

 

 

 

 

 

 

5

4

3

3

 

2

 

1

 

0

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

5

4

3

2

 

5

 

4

 

3

 

2

1

 

0

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

5

4

3

3

 

5

 

4

3

 

2

1

 

0

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

5

4

3

3

 

5

 

4

 

3

2

1

 

0

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

5

4

3

3

 

2

 

 

4

3

2

1

0

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

5

4

3

2

 

5

 

4

3

 

2

1

 

0

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.2. Диаграмма работы таймера в различных режимах

 

 

 

 

Режим 1 (ждущий мультивибратор).

 

На

выходе OUT

формируется

 

 

 

отрицательный импульс длительностью

где n – число,

 

 

 

 

 

 

 

 

t=n*T,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

загруженное

в счетчик, T

период тактовых

импульсов.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Низкий уровень на выходе OUT устанавливается со следующего

такта после подачи

на вход GATE сигнала высокого уровня.

Загрузка в счетчик нового числа не

влияет на длительность

текущего импульса,

а учитывается при следующем запуске.

Перезапуск счетчика производится

нарастающим фронтом

36

входа GATE (без перезагрузки счетчика). Минимальное допустимое значение n=1.

Режим 2 (генератор частоты). Каждый раз после достижения счетчиком нуля на выходе OUT появляется отрицательный импульс длительностью один такт. Перезагрузка счетчика сказывается только после перезапуска счетчика. При исчезновении сигнала высокого уровня на входе GATE прекращается счет и на выход OUT подается напряжение высокого уровня. Перезапуск счетчика происходит при наличии на входе GATE сигнала высокого уровня.

Режим 3 (генератор меандра). Аналогичен режиму 2, но положительный уровень выходного сигнала занимает первый полупериод, а отрицательный – второй полупериод. Точнее, если n (начальное значение счетчика) четно, то длительность положительного и отрицательного полупериодов равна n*T/2; если же n нечетно – то (n+1)*T/2 и (n-1)*Т/2 соответственно. Низкий уровень сигнала на входе GATE запрещает счет, на выходе OUT устанавливается сигнал высокого уровня. Высокий уровень GATE разрешает счет, а нарастание его запускает счетчик начального состояния. Отметим, что n=3 в этом режиме недопустимо.

Режим 4 (счетчик событий). По окончании отсчета числа, загруженного в счетчик, на выходе OUT формируется отрицательный импульс длительностью один такт. Запись в счетчик во время счета младшего байта не влияет на текущий счет, а запись старшего байта перезапускает счетчик. Низкий уровень входа GATE запрещает счет, высокий – разрешает. Минимальное допустимое значение счетчика равно 1.

Режим 5 (счетчик событий с автозагрузкой). Главное отличие от предыдущего режима состоит в том, что каждое нарастание сигнала на входе GATE перезапускает счетчик. Перезагрузка счетчика не влияет на текущий цикл, однако следующий цикл определяется вновь занесенным числом.

Тактовая частота каждого канала = 1,19318 МГц т. е. каждый такт имеет длительность 0,84 мкс. Вход GATE каналов 0 и 1 всегда имеют высокий уровень, поэтому счет на этих каналах разрешен всегда. Вход GATE канала 2 управляется битом 0 порта 61h.

37

Назначение каналов таймера в ПК следующее:

1. Канал 0 предназначен для генерации прерываний системного времени. При начальной загрузке BIOS инициализирует канал 0 для работы в режиме 3 с начальным значением вычитающего счетчика 0 (65536 декрементов на цикл счета). Поэтому частота системного времени определяется как f=1,19318 МГц/65536 = 18,2 Гц, и, таким образом, запрос прерывания уровня IRQ0 контроллера прерываний i8259A (вектор Int 08) происходит с частотой 18,2 Гц, т.е. каждые 55 мкс. Обработчик прерывания (по вектору Int 08h) модифицирует с этой же частотой 32-разрядный счетчик в области данных BIOS (начиная с адреса 0040:006C). Когда значение счетчика достигнет 1 573 040 (это соответствует 24 часам), он сбрасывается в 0, и устанавливается флаг перехода через начало суток (ячейка памяти 0040:0070), после чего начинается отсчет новых суток. Канал 0 можно перепрограммировать, но только на короткое время, в противном случае BIOS не сможет отслеживать текущее время и дату, а также нарушится работа с гибкими дисками, так как включение и выключение их двигателей отсчитывается по системному времени.

2. Канал 1 таймера работает в режиме 2 с начальным значением счетчика 18, поэтому регенерация памяти происходит каждые 18 мкс. Перепрограммировать его нельзя, так как это приведет к потере данных в оперативной памяти.

2. Канал 2 таймера предназначен для генерации звуковых сигналов. В IBM PC таймер имеет базовый адрес 40h и программируемые регистры (табл. 3.1).

Таблица 3.1

Программируемые регистры таймера

Адрес

Операция

Назначение

40h

запись

Загрузка счетчика канала 0

 

чтение

Чтение счетчика канала 0

41h

запись

Загрузка счетчика канала 1

 

чтение

Чтение счетчика канала 1

42h

запись

Загрузка счетчика канала 2

 

чтение

Чтение счетчика канала 2

43h

запись

Запись управляющего байта

 

 

в регистр режима канала

38

Существует два способа чтения текущего значения счетчика канала:

1.Чтение с остановом счетчика. Для обеспечения стабильных показаний необходимо приостановить работу канала либо подачей сигнала низкого уровня на вход GATE (кроме режима 1), либо блокированием тактовых импульсов.

2.Чтение "на лету". Для считывания счетчика без остановки процесса счета используется посылка в порт 43h управляющего

байта в режиме "защелкивания". Этим фиксируется текущее значение счетчика и можно программно считать сначала его младший байт, а затем старший байт.

3.2. Часы реального времени (РТС)

РТС реализованы на CMOS Memory and Real Time Clock,

которая представляет собой небольшое ОЗУ (до 100 8-битных регистров) и часы-календарь, питание обеспечивается от батареи. Содержимое памяти модифицируется с помощью утилиты BIOS. Доступ к регистрам RTC выполняется через порты ввода/вывода (прерывание Int 70h адресует регистр, а с помощью Int 71h содержимое регистра читается). Так как эта память имеет быстродействие порядка нескольких микросекунд, то между командами адресации и чтения регистров нужна программная задержка. Назначение регистров, поддерживающих реальное время, следующее (BCD-формат), табл.3.2:

 

 

 

Таблица 3.2

Регистр

Назначение

Регистр

Назначение

00

Секунды

06

День недели

01

Тревога секунд

07

День недели

02

Минуты

08

Месяц

03

Тревога минут

09

Год (2 младшие цифры)

04

Часы

32

Век (2 старшие цифры)

05

Тревога часов

 

 

Поддержка РТС со стороны BIOS обеспечивает интерфейс для функций часов и календаря. Сам РТС аппаратно реализует функции отсчета времени суток и сигнализации. При разрешении РТС прерывает центральный процессор с частотой 1024 Гц (период

39

976 мкс), запрос прерывания уровня IRQ8 контроллера прерываний ПКП2 (обработчик Int 70h).

Сервис службы времени реализуется с помощью следующих прерываний BIOS и DOS:

1.Прерывание таймера Int 08h. Источник прерывания – канал 0 таймера i8254. Обеспечивает: а) инкремент 32-разрядного счетчика системного времени в области BIOS (40:6C) с частотой 18,2 Гц; б) выключение двигателей НГМД; в) вызов прерывания Int 1Сh.

2.Прерывание пользователя Int 1Ch. Вызывается при каждом тике таймера. Не обрабатывается BIOS, при вызове управление передается программе-заглушке (IRET). Прерывание предназначено для организации работы прикладных программ, работающих в фоновом режиме с частотой 18,2 Гц. (Пользователь может записать в вектор 1Сh адрес собственного прикладного обработчика, вызываемого при каждом сигнале таймера).

3.Прерывание таймера и часов реального времени Int 1Аh. Обеспечивает сервис таймера и РТС. Имеет 2 функции работы с таймером:

00h – получить число тиков,

01h – установить число тиков.

Остальные функции обеспечивают получение информации от часов реального времени РТС (в BCD-формате):

а) 02h – получить текущее время; б) 03h – установить текущее время; в) 04h – получить дату;

г) 05h – установить дату;

д) 06h – включить будильник; е) 07h – сбросить будильник.

4. Прерывание Int 4Аh. Прерывание РТС генерируется из обработчика прерывания Int 70h при выполнении следующих условий:

через определенные интервалы времени (~1 мс);

значения 3-х регистров тревоги (секунд, минут и часов) совпадает со значениями соответствующих временных регистров (сигнальное прерывание);

конец модификации (после каждого обновления значений регистров времени. При возникновении сигнального прерывания программа пользователя должна перехватить

40

вектор прерывания Int 4Аh перед вызовом функции установки сигнализации (поместить в вектор указатель на собственный обработчик). В этом случае работают функции 06h и 07h прерывания Int 1Аh.

5.Прерывание Int 21h (DOS). Работает с системным таймером и предоставляет следующий сервис с помощью функций: а) 2Аh – получить дату; б) 2Bh – установить дату; в) 2Сh – получить время (час, мин, сек); г) 2Dh – установить время.

Кроме стандартных системных функций, предоставляемых службой времени через прерывания BIOS и DOS, можно выделить функции, имеющие немаловажное значение для пользователя, разрабатывающего программное обеспечение для устройств, работающих в масштабе реального времени: задержка программных операций, управление работой внешних устройств в фоновом режиме

игенерация звука.

3.3.Задержка программных операций

Для программирования задержек можно применить стандартный прием пустых циклов, но рациональнее использовать системные ресурсы, предоставляемые службой системного времени ПК. Цель достигается применением функции 0h прерывания Int 1Аh. Точность получения задержки 55 мс. Рассмотрим пример: запрограммировать задержку 10 с.

; получение значения счетчика системного времени и установка ;задержки

 

mov ah, 0

; номер функции чтения счетчика

 

int 1ah

; получаем значение счетчика

 

add dx, 182

; добавляем 10 с (10/0,055=182)

 

mov bx, dx

; запоминаем нужное значение в bx

 

 

; проверка значения счетчика

 

 

; системного времени

repeat:

int 1ah

; получаем значение счетчика

 

cmp dx, bx

; сравниваем с искомым

 

jne repeat

; если не равно, повторяем

 

 

; иначе задержка получена

41

Для получения задержек большей точности (1мкс) можно применить функцию 86h прерывания Int 15h (в регистры CX:DX заносится задержка в микросекундах).

3.4.Управление работой в фоновом режиме

Врежиме реального времени программа часто выполняет работу, но в определенный момент она должна прервать свои операции для выполнения конкретной задачи для управления внешним устройством. Решить данные задачи можно, применяя фоновый обработчик, связанный с программой BIOS, которая работает со счетчиком системного времени. Этот метод заключается в использовании прерывания Int 1Ch, обработчик которого вызывается

вфоновом режиме каждые 55 мс, не препятствуя при этом работе основной программе. Схема вызова обработчика прерывания Int 1Ch изображена на рис. 3.3.

 

 

 

Таблица прерываний

 

 

Программа BIOS

 

 

 

модификациисчетчика

 

 

 

 

 

 

 

 

 

Прерывание от

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

таймера

 

 

 

 

 

 

 

 

 

 

 

 

08h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

…………

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вектор1Сh

 

 

 

 

 

Int 1Ch

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.3. Схема вызова обработчика прерывания Int 1Ch

Пользователь может перехватить вектор 1Ch, т.е. записать в него адрес собственного прикладного обработчика, в котором будут использованы средства реального времени. Перехват вектора можно выполнить, используя функцию 25h прерывания Int 21h. При этом в начале основной программы нужно сохранить старый вектор Int 1Сh,

42