Работа по прерываниям


Программный интерфейс DOS и BIOS организован в виде обращения к процедурам по прерываниям.

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

Прерывания делятся на внешние по отношению к процессору, например от часов реального времени, и внутренние, например деление на ноль или переполнение. Более того, любое прерывание можно вызвать командой

INT n

где n - номер прерывания, обычно обозначается в шестнадцатеричной системе счисления (с буквой Н в конце числа).

 

Реакцией процессора на прерывание является выполнение подпрограммы, адрес начала которой, или вектор прерывания, находится в таблице, номер строки которой и есть номер прерывания. Максимальное количество прерываний для процессоров Intel – 256.

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

В IBM-совместимых компьютерах не все вектора прерываний распределены между событиями и устройствами. Неиспользуемые номера и предназначены для обращения к подпрограммам ОС.

Так как свободных прерываний не много, то по одному вектору может вызываться несколько подпрограмм. Номер подпрограммы, называемый функцией или службой преры­вания, передается в качестве параметра, записываемого в регистр АН. Например, наиболее часто используемое прерывание DOS 21Н имеет 87 служб.

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

 

Основные прерывания DOS:

21Н – общие функции DOS;

25Н – безусловное чтение с диска;

26Н – безусловная запись на диск.

Основные прерывания BIOS:

10Н – работа с видеосистемой;

12Н – получение размера основной памяти;

13Н – работа с дисками;

14Н – работа с последовательными портами;

15Н – разнообразные службы;

16Н – работа с клавиатурой;

17Н – работа с принтером;

19Н – перезагрузка компьютера;

1АН – работа с часами реального времени.

Иногда возникает ситуация, когда в программе необходимо определить собственные алгоритмы реакции на прерывания от внешних устройств или операционной системы, отменив при этом стандартные реакции.

Процедура, которая будет обслуживать прерывание, должна иметь директиву interrupt и строго фиксированный список параметров:

Procedure <имя> (Flags,

CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word);

interrupt;

Допускается отсутствие или задание отдельных параметров. Содержимое регистров процессора передается в процедуру в качестве параметров, поэтому их можно изменять.

 

Собственно переопределение некоторого прерывания производится обращением к процедуре модуля DOS:

SetIntVec (IntNo:byte; Vector:Pointer);

IntNo – номер прерывания, которое необходимо переопределить;

Vector – адрес новой процедуры обработки прерывания, которая будет запускаться автоматически.

 

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

GetIntVec (IntNo:byte; Var Vector:Pointer);

которая присваивает второму параметру адрес текущей реакции на прерывание с номером IntNo.

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

 

Программы, обрабатывающие прерывания, являются специфическими, так как обращение к ним происходит не из сегмента программ, а из таблицы прерываний. Поэтому для них необходимо указывать дальний (межсегментный) вызов директивой компилятора {$F+}.

Пример. Обработка прерывания, возникающего при нажатии клавиш Ctrl-Break.

Program Ctrl_Break;

{ Демонстрационный пример обработки прерывания,

возникающего при нажатии клавиш Ctrl-Break }

Uses Dos;

Const BreakFlag:boolean=False;

Var IntSt:pointer; { Адрес стандартного обработчика }

{$F+}

Procedure CtBr; interrupt;

Begin

BreakFlag:=true;

end;

{$F-}

Begin

{ Запоминаем адрес стандартной реакции }

GetIntVec($1b,IntSt);

SetIntVec($1b,@CtBr);

Writeln('Для окончания нажмите Ctrl-Break');

Repeat

Until BreakFlag;

{ Восстанавливаем первоначальный адрес реакции }

SetIntVec($1b,IntSt)

end.

Контрольные вопросы

1. Что такое «ассемблер»?

2. Что такое «макроассемблер»?

3. В каких случаях используется язык Ассемблер?

4. Что такое «встроенный ассемблер»?

5. Что такое «OBJ-файл»?

6. Какова структура asm-оператора?

7. Как в asm-операторах записываются комментарии?

8. Каков общий вид команды ассемблера (asm-оператора)?

9. Все ли регистры можно изменять в asm-операторах?

10. Как записываются локальные и глобальные метки в asm-операторах?

11. Какие коды инструкций (команд) используются во встроенном ассемблере?

12. Как обозначаются имена, совпадающие с зарезервированными словами?

13. Как в asm-операторах Паскаля в выражениях трактуется имя переменной?

14. Как в asm-операторах обозначается переменная с результатом функции?

15. С помощью какой директивы создается подпрограмма, полностью написанная на языке ассемблер?

16. Как можно напрямую обратиться к ячейкам памяти?

17. К ячейкам какого размера можно обращаться напрямую?

18. Как записывается адрес при обращении к ячейкам массива?

19. Как выполнить доступ к портам ввода-вывода?

20. Какой командой можно вызвать любое прерывание?

21. Что является реакцией процессора на прерывание?

22. Какой номер имеет наиболее часто используемое прерывание DOS?

23. Какую директиву должна иметь подпрограмма, обслуживающая прерывание?

24. Какова форма записи процедуры переопределения прерывания?

25. Какова форма записи процедуры восстановления прерывания?

 


Глава 9. Модули

Основные понятия

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

Паскаль является алголоподобным языком, а в таких языках отсутствует модульность. В стандартном Паскале даже нет возможности отдельно транслировать и тестировать подпрограммы. В Турбо Паскале с введением понятия «модуль» стал возможным современный стиль реализации программных пакетов, легко подключаемых к любой программе, а так же ослабли ограничения на суммарный объем готовых программ.

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

Модуль – это совокупность или коллекция программных ресурсов, предназначенных для использования другими программами или модулями. Ресурсы – это любые программные объекты Паскаля, – константы, переменные, типы, подпрограммы.

Основное отличие модуля от программы заключается в том, что его объекты только используются другими программами, но сам модуль выполнить нельзя.

 

Все программные ресурсы модуля делятся на две части:

1). Интерфейс. Здесь находятся видимые объекты, то есть те, которые можно использовать в других программах, и предназначенные именно для этих целей.

2). Реализация. Сюда помещают рабочие объекты, называемые невидимыми или скрытыми. Например, если модуль содержит подпрограмму универсального применения, то вызываемые этой подпрограммой процедуры и функции, содержащиеся в модуле, и используемые ею переменные могут иметь чисто внутренний характер и не должны использоваться другими программами.

В разделе реализации так же может находиться секция инициализации, содержащая любые операторы. Они будут выполняться сразу после запуска программы до операторов основной программы. Используется обычно для установки различных начальных значений. Если в Турбо Паскале секция инициализации начиналась со слова Begin, то в Delphi 1.0 для этих целей введено новое служебное слово Initialization.

Начиная с Delphi 2.0, здесь может использоваться и секция завершения (finalization), в которой выполняются действия, противоположные секции инициализации. Например, закрытие файлов, восстановление векторов прерываний и другие.

Таким образом, общая структура модуля следующая:

UNIT <имя модуля>

Interface

<описание видимых объектов>

Implementation

<описание скрытых объектов>

[ Begin {Initialization}

<операторы инициализации>

{ Finalization

<завершающие операторы> } ]

end.

Например, модуль, подключаемый при работе с комплексными числами:

Unit COMPLEX;

Interface

Type Complex = Record

Re,Im:Real;

end;

Function CADD (A,B:complex):complex;

Function CMUL (A,B:complex):complex;

Function CDIV (A,B:complex):complex;

... ...

Implementation

Function CADD;

... {тело функции}

Function CDIV;

Var X:Real; {скрытая переменная}

... ...

end.

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

Таким образом, программа может связываться с модулем через описания видимых объектов, то есть через интерфейс модуля. Поэтому, если необходимо расширить модуль или изменить реализацию какой-либо подпрограммы, и если интерфейс модуля при этом не меняется, то такое изменение никак не отразится на использующих программах.



Дата добавления: 2016-06-29; просмотров: 2127;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.02 сек.