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

Программный интерфейс 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. Какова форма записи процедуры восстановления прерывания?


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: