Использование стандартных функций и разработка собственных прерываний в ОС MSDOS
Продолжительность работы – 4 часа.
Цель работы: приобретение навыков использования стандартных и разработка собственных прерываний в ОС MSDOS.
Используемое оборудование: любой IBM РС-совместимый компьютер.
Используемое программное обеспечение: система программирования Turbo Pascal 7.0.
Подготовка к работе
Изучить по конспекту лекций и приведенной ниже литературе, следующие вопросы:
· аппаратные и программные прерывания в IBM PC;
· обращение к функциям MSDOS;
· разработка собственных прерываний в ОС MSDOS;
· дополнение к существующему прерыванию в ОС MSDOS;
· назначение и состав модуля DOS в Turbo Pascal 7.0.
Программа работы
1. Составьте текст программы на языке Паскаль, которая формирует на экране меню, строки которого соответствуют названиям пунктов 2-4 лабораторной работы. Последний пункт меню - “Выход” - завершает работу программы. Пункты меню имеют сквозную нумерацию (табл. 1.) и выполняются при нажатии соответствующей клавиши. Пока программа должна обрабатывать нажатие клавиши только для завершения работы.
2. Использование стандартных функций MSDOS. В соответствии с вариантом (табл. 2), заданным преподавателем, добавьте в текст основной программы операторы для вызова требуемой функции MSDOS и вывода полученных результатов на экран дисплея.
3. Разработка собственного программного прерывания. Добавьте к основной программе процедуру обработки собственного прерывания (номер прерывания задан в табл. 3), в котором будут выполняться те же действия, что и в п.2.
4. Дополнение к существующему аппаратному прерыванию от таймера. Добавьте к основной программе процедуру обработки прерывания, которая будет являться дополнением к существующему аппаратному прерыванию от таймера. При помощи дополнения к прерыванию реализовать выполнение задания в соответствии с вариантом из табл. 4.
5. Добавьте к основной программе операторы, которые выводят на экран значения векторов прерывания и точек входа в процедуры обработки прерывания. Значения представить в виде логического адреса и физического адреса.
6. Сделайте выводы и оформите отчет по лабораторной работе.
табл. 1
№ варианта | |||||||
Нумерация меню | 1 - 4 | F1 – F4 | ABCD | abcd | АБВГ | абвг | F5 – F8 |
табл. 2
№ | Функция MSDOS | |||
Вар. | Номер прерыв | Входные параметры | Выходные параметры | Сообщение |
1. | 12H | AX- размер памяти в кБ. | Количество памяти в кБ. | |
2. | 21H | AX=3000H | AL- основной номер версии. AH- вспомогат. номер версии. | Номер версии ОС |
3. | 21H | AH=2AH | AL- день недели (0-вс. и т.д.). CX- год (1980-2099). DH- месяц (1-12). DL- день (1-31). | Дата в формате: день.месяц.год |
4. | 21H | AH=2CH | CH- часы (0-23). CL- минуты (0-59). DH- секунды (0-59). | Время в формате: час.минута.сек. |
5. | 21H | AH=1BH | AL- кол. сект. в кластере. CX- кол. байт в секторе. DX- кол. кластеров. | Объем диска в байтах. |
6. | 21H | AH=36H | DL- номер диска (0; 1-А). AX- кол. сект. в кластере. BX- кол. своб. кластеров. CX- длина сектора в байтах. DX- кол. класт. на дорожке. | Количество свободного места в байтах. |
7. | 21Н | AH=09H DS:DX- нач.адрес строки с символом ‘$’ в конце. |
табл. 3
№ варианта | |||||||
Номер прерывания |
табл. 4
№ вар. | Действие |
1. | Отсчет секунд и десятых долей с начала работы программы. |
2. | Выдача звукового сигнала с периодичностью 1 сек. |
3. | Изменение фона экрана с периодичностью 2 сек. |
4. | Изменение цвета символов с периодичностью 3 сек. |
5. | Пульсирующее окно с дискретностью изменения параметров 1/9 сек. |
6. | Перемещающееся окно с дискретностью изменения координат – 1/6 сек. |
7. | Вариант 3 + Вариант 4. |
Методические указания к выполнению работы
Внутренняя организация МП семейства 80х86 в реальном режиме работы
В реальном режиме работы (например, под управлением MSDOS) любой из процессоров семейства 80х86 функционирует просто как 16-разрядный "быстрый" МП 8086, т.е. полностью соответствуют его программной модели.
Внутренние регистры МП
В состав МП входят следующие блоки регистров (табл. 5):
табл. 5
CS | сегмент кода | |||
DS | сегмент данных | Сегментные | ||
SS | сегмент стека | Регистры | ||
ES | дополнительный сегмент | |||
IP | указатель команд | |||
SP | указатель стека | |||
BP | указатель базы | Регистры | ||
SI | индексный регистр | |||
DI | индексный регистр | Общего | ||
AX | AH | AL | аккумулятор | |
BX | BH | BL | указатель базы | Назначения |
CX | CH | CL | счетчик | |
DX | DH | DL | расширитель аккумулятора | |
F | регистр флагов |
· блок сегментных регистров. 4 сегментных регистра используются для хранения 16-и разрядных сегментных адресов начала сегмента.
· IP – 16-и разрядный регистр указателя команд, в котором хранится адрес смещения команды в кодовом сегменте.
· регистры общего назначения (РОН) могут использоваться для хранения любой информации. Но, как правило, РОН AX, BX, CX и DX используются в основном для хранения данных и допускают раздельное использование их байтов, а регистры SP,BP,SI,DI используются, в основном, для хранения адресной информации. Кроме того, каждый из РОН имеет специальные функции, которые используются по умолчанию в некоторых командах.
· регистр флагов (признаков) F содержит признаки последней выполненной АЛУ операции.
Организация памяти
Память представляет собой последовательность байтов, каждый из которых имеет 20-и разрядный физический адрес (исполнительный адрес) в диапазоне 00000-FFFFF. Все пространство памяти представляется как набор сегментов, определяемых программным путем. Размер каждого сегмента составляет 64К. В каждый момент времени в памяти имеется 4 сегмента: CS, SS, DS, ES. Эти сегменты могут не пересекаться, могут частично пересекаться, а если содержимое сегментных регистров одинаково, то они полностью совпадают.
Для определения физического адреса памяти необходимо знать начальный адрес сегмента и внутрисегментное смещение. Физический адрес формируется сумматором блока шинного интерфейса МП (рис. 1) в соответствии со следующей формулой:
FA = SR*16 + ЕА, где:
FA – физический адрес;
SR – содержимое текущего сегментного регистра;
ЕА – эффективный адрес.
рис. 1
Сегментный адрес хранится в одном из сегментных регистров (16 старших разрядов 20-ти разрядного адреса памяти). При вычислении физического адреса памяти к содержимому сегментного адреса дописываются нули. Поэтому начальные адреса сегментов всегда кратны 16.
Смещение в сегменте формируется процессором в зависимости от его режима работы. Если процессор выполняет выборку команд из памяти, то сегментный адрес берется из регистра CS, а смещение – из указателя команд IP (рис. 2). Во всех остальных случаях смещение формируется из содержимого РОН, индексных или базовых регистров. Способ вычисления смещения является способом адресации.
рис. 2
Внутрисегментный адрес называется смещением, если речь идет об аппаратных средствах. В системе команд в этом случае используется понятие эффективный адрес.
Для точного указания адреса в памяти используется логический адрес, который имеет следующий формат записи:
SR:EA; где SR – содержимое сегментного регистра; EA – эффективный адрес.
Например, пусть DS=2000H, EA=3100H. Тогда:
Логический адрес: 2000:3100
Физический адрес: 2000 0 + 3100 = 23100
Иногда объем памяти измеряется в параграфах (§): 1§ = 16 байт.
Система прерываний МП
Прерывание – это событие, которое прерывает нормальный ход выполнения программы (процесса).
МП 80х86 имеет эффективную систему прерываний, в которой каждому прерыванию поставлен в соответствие код (от 0 до 255), который идентифицирует тип прерывания. В системах с МП 8086 различают внешние и внутренние прерывания.
Внешние прерывания – это прерывания, обусловленные каким-либо внешним событием. Сигнал свершения этого события поступает на один из двух входов МП:
INTR – вход маскируемого запроса прерывания от внешних устройств;
NMI – вход немаскируемого запроса прерывания.
Для разрешения обслуживания внешних прерываний используется выход подтверждения прерывания .
МП имеет только один вход для запроса прерывания, а устройств, требующих обслуживания по прерыванию в системе может быть несколько. Для обслуживания прерываний от нескольких устройств используется специализированная МС - программируемый контроллер прерывания (ПКП). ПКП выполняет следующие основные функции:
· фиксирует запросы прерываний от внешних устройств;
· анализирует приоритеты поступивших прерываний;
· запрашивает у МП и, в случае подтверждения прерывания, выдает МП номер прерывания с наивысшим приоритетом.
При поступлении на один из входов ПКП IRQ0-IRQ7 запроса прерывания от внешнего устройства (рис. 3), ПКП фиксирует это прерывание, анализирует его приоритет и, если поступившее прерывание имеет наивысший в данный момент приоритет, выдает МП сигнал запроса прерывания INTR. При поступлении на вход INTR сигнала высокого уровня процессор заканчивает выполнение текущей команды и выдает сигнал подтверждения прерывания , который поступает на соответствующий вход ПКП. В ответ на этот сигнал ПКП процессору информации не передает. Затем процессор вырабатывает еще один сигнал , в ответ на который ПКП передает МП по шине данных байт, определяющий номер (тип) прерывания (0¸255). Этот номер однозначно связан с ПП обслуживания прерывания, на которую затем переходит процессор.
рис. 3
Прерывания по входу INTR можно разрешить или запретить(замаскировать), управляя состоянием флага I. Для этих целей имеются две специальные команды:
CLI – очистить флаг I=0 (запретить прерывания по входу INTR);
STI – установить флаг I=1 (разрешить прерывания по входу INTR).
Если пришел запрос прерывания, а прерывания были запрещены (I=0), то процессор не обслуживает этот запрос и не запоминает его.
Запрос прерывания по входу NMI является немаскируемым и программно его запретить нельзя. После появления сигнала на входе NMI процессор автоматически переходит к обслуживанию прерывания типа 2 (подтверждение прерывания при этом не требуется). Обычно сигнал запроса прерывания по входу NMI используют события, требующие немедленной обработки (например, аварийное отключение питания).
Запрос прерывания по входу NMI запоминается в МП и имеет более высокий приоритет, чем прерывания по входу INTR.
Внутренние прерывания связаны с определенными событиями внутри процессора или инициируются при помощи команд. В случае внутренних прерываний не вырабатываются сигналы подтверждения прерываний , процессор просто переходит по вектору, заданному типом прерывания. Виды внутренних прерываний:
1. прерывание при ошибке деления на “0”. Возникает в том случае, если частное слишком велико или делитель = 0 (тип 0);
2. прерывание по переполнению. Выполняется по команде INTO при условии, что установлен флаг переполнения V=1 (тип 4);
3. прерывание при трассировке. Возникает по окончании команды, если установлен флаг трассировки Т=1 (тип 1);
4. прерывание типа 3. Возникает при выполнении однобайтной команды INT 3. Используется для установки контрольных точек разрыва при отладке программ.
5. программные прерывания при выполнении двухбайтных команд INTn (где n – номер прерывания). Программные прерывания на самом деле ничего не прерывают, а являются удобным средством для доступа к стандартным подпрограммам (функциям ОС).
Рассмотрим взаимосвязь между типом прерывания и п/пр обслуживания прерываний.
Таблица векторов прерываний
рис. 4
Для обслуживания прерываний в системах с МП 8086 используется таблица векторов прерываний объемом 1Кбайт, расположенная с нулевого адреса памяти (0...3FF). На каждый тип прерывания отводится 2 слова (4 байта) памяти, в которых хранится логический адрес п/пр обслуживания прерывания. Слово с большим адресом загружается в сегментный регистр CS, а с меньшим адресом – в регистр указателя команд IP. Таблица векторов прерываний имеет вид представленный на рис. 4.
Таким образом, получив номер типа прерывания, процессор умножает номер типа прерывания на 4 и получает адрес вектора прерывания. При переходе к п/пр обслуживания прерываний МП сохраняет в стеке содержимое CS,IP,F. Затем CS и IP загружаются новым содержимым из вектора прерываний. Возврат из п/пр осуществляется по команде IRET, которая восстанавливает содержимое регистров CS,IP,F из стека.