Системное программирование (работа 2)
ДОКДАД
ПО ДИСЦИПЛИНЕ:
«СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ»
НА ТЕМУ:
«ПРЕРЫВАНИЕ»
Содержание
Прерывание и его природа
Контролер прерываний
Обработка прерываний в реальном режиме
Характеристики реального режима работы микропроцессора
Общая схема обработки прерываний в реальном режиме
Написание собственного прерывания
Пример разработки прерывания в общем случае
Прерывание и его природа
Прерывание – инициируемый определенным образом процесс, временно переключающий микропроцессор на выполнение другой программы с последующим возобновлением выполнения прерванной программы.
Механизм прерываний позволяет обеспечить наиболее эффективное управление не только внешними устройствами, но и программами. Нажимая клавишу на клавиатуре, вы тем самым инициируете посредством прерывания немедленный вызов программы, которая распознает нажатую клавишу, заносит ее код в буфер клавиатуры, откуда он в дальнейшем считывается некоторой другой программой или операционной системой. На время такой обработки микропроцессор прекращает выполнение некоторой программы и переключается на так называемую процедуру обработки прерывания. После того как данная процедура выполнит необходимые действия, прерванная программа продолжит выполнение с точки, где было приостановлено ее выполнение. Некоторые операционные системы используют механизм прерываний не только для обслуживания внешних устройств, но и для представления своих «услуг». Так, операционная система MS-DOS взаимодействует с системными и прикладными программами преимущественно через систему прерываний.
Исходя из вышеприведенных рассуждений, можно сказать, что прерывания могут быть внешними и внутренними.
Внешние прерывания вызываются внешними по отношению к микропроцессору событиями. На приведенном ниже рис.1 схематически изображена подсистема прерываний компьютера на базе микропроцессора Intel.
Рис.1. Подсистема прерываний компьютера
На рис.1 видно, что у микропроцессора есть два физических контакта – INTR и NMI. На них и формируются внешние по отношению к микропроцессору сигналы, возрастающие фронты которых извещают микропроцессор о том, что некоторое внешнее устройство просит уделить ему внимание. Вход INTR (Interrupt Request) предназначен для фиксации запросов от периферийных различных устройств, например таких, как системные часы, клавиатура, жесткий диск и т.д. Вход NM1 (NonMaskeable Interrupt) – немаскируемое прерывание. Этот вход используют для того чтобы сообщить микропроцессору о некотором событии, требующем безотлагательной обработки, или катастрофической ошибке. Внешние прерывания относятся, естественно, к не планируемым прерываниям.
Внутренние прерывания возникают внутри микропроцессора во время вычислительного процесса. К их появлению приводит одна их двух причин:
Ненормальное внутреннее состояние процессора, возникшее при обработке некоторой команды программы. Такие события принято называть исключительными ситуациями, или просто исключениями. Этот вид прерываний отчасти также можно отнести к не планируемым;
Обработка машинной команды int xx. Этот тип прерываний называется программным. Это – планируемые прерывания, так как с их помощью программист обращается в нужное для него время за обслуживанием своих запросов либо к операционной системе, либо к BIOS, либо к собственным программам обработки прерываний.
Для глубокого понимания процессов, происходящих в компьютере при осуществлении прерывания, необходимо узнать о том, какие ресурсы компьютера при этом задействуются, каковы их характеристики и принципы функционирования.
В общем случае система прерываний – это совокупность программных и аппаратных средств, реализующих механизма прерываний.
К аппаратным средствам системы прерываний относятся:
Выводы микропроцессора:
INTR – вывод для входного сигнала внешнего прерывания. На этот вход поступает выходной сигнал от микросхемы контролера прерываний 8259А;
INTA – вывод микропроцессора для выходного сигнала подтверждения получения сигнала прерывания микропроцессором. Этот выходной сигнал поступает на одноименный вход INTA микросхемы контроллера прерываний 8259А;
NMI – вывод микропроцессора для входного сигнала немаскируемого прерывания;
Микросхема программируемого контроллера прерываний 8259А. она предназначена для фиксирования сигналов прерываний от восьми различных внешних устройств. В силу ее важной роли при работе всей вычислительной системы мы ее подробно рассмотрим ниже;
Внешние устройства: таймер, клавиатура, магнитные диски и.д.
К программным средствам системы прерываний реального режима относятся:
Таблица векторов прерываний. В этой таблице в определенном формате, который зависит от режима работы микропроцессора, содержатся указатели на процедуры обработки соответствующих прерываний;
Следующие флаги в регистре флагов flags\eflags:
IF (Interrupt Flag) – флаг прерывания. Предназначен для так называемого маскирования (запрещения) аппаратных прерываний, то есть прерываний по входу INTR. На обработку прерываний остальных типов флаг IF влияния не оказывает. Если IF = 1, микропроцессор обрабатывает внешние прерывания, если IF = 0, микропроцессор игнорирует сигналы на входе INTR;
TF (Trace Flag) – флаг трассировки. Единичное состояние флага TF переводит микропроцессор в режим покомандной работы. В режиме покомандной работы после выполнения каждой машинной команды в микропроцессоре генерируется внутреннее прерывание с номером 1, и далее следуют действия в соответствии с алгоритмом обработки данного прерывания;
Машинные команды микропроцессора: int, into, iret, cli, sti.
Контролер прерываний
Центральное место в схеме обработки аппаратных прерываний занимает программируемый контроллер прерываний (ПКП), выполненный в виде специальной микросхемы i8259A. Эта микросхема может обрабатывать запросы от восьми источников внешних прерываний. Этого явно мало, поэтому в стандартной конфигурации вычислительной системы обычно используют две последовательно соединенные микросхемы i8259A. В результате такого соединения количество возможных источников внешних прерываний возрастает до 15.
Перечислим функции, выполняемые микросхемой контроллера прерываний:
Фиксирование запросов на обработку прерывания от восьми источников, формирование единого запроса на прерывание и подача его на вход INTR микропроцессора;
Формирование номера вектора прерывания и выдача его на шину данных;
Организация приоритетной обработки прерываний;
Запрещение (маскирование) прерываний с определенными номерами.
На рис.2 показано схематическое представление внутренней структуры и физических выводов микросхемы i8259A.
Рис.2. Структурная схема и схематическое представление выводов i8259A.
Рассмотрим назначение основных структурных компонентов контроллера прерываний:
Регистр запросов на прерывания IRR (Interrupt Request Register) – восьмиразрядный регистр, фиксирующий поступление сигнала на один из входов i8259A – irq0…irq7. фиксация выражается в установке соответствующего бита в единичное состояние;
Регистр маскирования прерываний IMR (Interrupt Mask Register) – восьмиразрядный регистр, с помощью которого можно запретить обработку запросов на прерывания, поступающих на соответствующие входы (уровни) irq0…irq7. Для запрещения (маскирования) определенных уровней прерываний необходимо установить соответствующие биты регистра IMR. Эта операция осуществляется путем программирования порта 21h.
Регистр обслуживаемых прерываний ISR (Interrupt Service Register) – восьмиразрядный регистр, единичное состояние разрядов которого показывает, прерывания каких уровней обрабатываются в данный момент в микропроцессоре;
Арбитр приоритетов PR (Priority Resolver) – функцией данного блока является разрешение конфликта при одновременном поступлении запросов на входы irq0…irq7;
Блок управления – основной функцией данного блока является организация информационного обмена контроллера прерываний и микропроцессора через шину данных. На этот блок замыкаются как выводы d0…d7, так и некоторые другие.
Рассмотрим возможные прохождение и обработку сигнала прерывания от некоторого внешнего устройства. При этом воспользуемся структурной схемой контроллера прерываний и обозначениями не ней (рис.2).
Допустим, на вход irq0 поступает сигнал прерывания, что приводит к установке нулевого бита регистра IRR. Этот регистр связан с регистром маски IMR, состояние битов которого определяет, какие уровни прерываний запрещены (единичные биты) или разрешены к обработке (нулевые биты). Управление данным регистром осуществляется через порт 21h. Таким образом, если бит 0 в IMR равен нулю, то прерывание уровня 0 разрешено. Далее сигнал поступает к арбитру приоритетов. Как мы уже отметили, функция этого блока – разрешение конфликтов при одновременном поступлении запросов на несколько уровней. Обычно самый высокий приоритет у уровня irq_0, и далее уменьшается с возрастанием номера уровня. Если конфликта нет, то сигнал поступает на схему управления контроллером прерываний, которая формирует сигнал на выводе int. Этот вывод связан со входом микропроцессора INTR. Таким образом, сигнал на входе i8259A достиг микропроцессора. Отметим важные моменты на этом этапе:
Анализируется флаг IF. Единичное состояние этого флага говорит о том, что аппаратные прерывания разрешены, нулевое – запрещены.
Если прерывания запрещены, то запрос на прерывание «повисает» до момента установки IF в единицу.
Если прерывания разрешены, микропроцессор выполняет следующие действия:
Сбрасывает флаг IF в ноль;
Формирует сигнал подтверждения прерывания на выводе микропроцессора INTR. Этот вывод микропроцессора замкнут на одноименный вывод микросхемы i8259A.
Таким образом, сигнал о прерывании прошел через микропроцессор и вернулся обратно в контроллер прерываний i8259A через вывод INTA. Данный вывод внутри контроллера прерываний замкнут на его схему управления, которая выполняет сразу несколько действий при поступлении этого сигнала:
Сбрасывает бит в регистре IRR, соответствующий уровню прерывания irq_0.
Устанавливает в 1 бит 0 регистра ISR, тем самым фиксируя факт обработки прерывания уровня 0 в микропроцессоре.
Формирует с помощью блока управления номер вектора прерывания, значение которого формируется в буфере данных и далее поступает на выводы i8259A d0…d7. Выводы d0…d7 замкнуты на шину данных, по которой номер вектора поступает в микропроцессор. В микропроцессоре этот номер используется для вызова соответствующей процедуры обработки прерывания.
На данном этапе обработки прерывания, после того как номер прерывания по шине данных поступил в микропроцессор, последнему стало известно все об источнике прерывания. Если в это время придет другой сигнал о прерывании того же уровня, то он будет запомнен установкой бита в IRR, и обслуживание этого прерывания будет отложено. Если приходит прерывание другого уровня, то его дальнейшая обработка зависит от приоритета, который оно имеет по отношению к уже обрабатываемым прерываниям. Если приоритет выше, то текущая процедура обработки прерывания останавливается, и вызывается процедура обработки более приоритетного прерывания.
Очень, важный момент связан с процессом завершения обработки прерывания. Проблема здесь в следующем. После принятия микропроцессором запроса на обслуживание прерывания в контроллере устанавливается бит в регистре ISR, номер этого бита соответствует уровню прерывания. Установка бита с данным номером блокирует все прерывания уровня, начиная с текущего, и менее приоритетные в блоке-арбитре приоритетов. Если процедура прерывания закончит свою работу , то она сама должна это бит сбросить, иначе все прерывания этого уровня и менее приоритетные будут игнорироваться. Для осуществления такого сброса необходимо послать код 20h в порт 20h. Есть и другая возможность – установить такой режим работы микросхемы i8259A, когда сброс этого бита будет производиться автоматически. Тонкий момент заключается в том, что происходить такой автоматический сброс будет с приходом сигнала INTA (то есть извещения о том, что запрос на обработку прерывания принят к обработке микропроцессором). Недостаток автоматического сброса в том, что существует вероятность прихода прерывания того же уровня, который уже обрабатывается в данный в данный момент микропроцессором. В этом случае процедура обработки прерывания должна обладать свойством рентабельности, то есть допускать повторное обращение к себе до завершения обработки предыдущего обращения. Для того чтобы процедура была рентабельной, она должна иметь специфическую структуру, в частности, для каждого сеанса обращения к ней создается своя область для хранения переменных и значений регистров, а исполняемая часть процедуры находится в оперативной памяти только в одном экземпляре. Иногда может потребоваться подобный автоматический сброс, но надежнее и проще, конечно, контролировать этот процесс и самостоятельно сбрасывать бит в ISR. Это можно сделать либо в конце работы процедуры, либо в том месте процедуры, начиная с которого можно разрешить рекурсивный вызов данной процедуры, будучи уверенным, в том, что она не разрушит никаких данных и работу программы в целом.
Другой не менее интересный момент заключается в том, что микропроцессор при принятии к обработке запроса на прерывание сбросил флаг IF в ноль, тем самым запретив все последующие аппаратные прерывания. Этим обстоятельством программист может пользоваться по своему усмотрению. Все запросы на прерывания с приоритетом, равным текущему или меньшим, будут запрещены в любом случае, - это обусловлено логикой работы контроллера i8259A. Поэтому программист должен решить, насколько его замыслам могут помешать запросы на более приоритетные прерывания. Если это некритично, то лучше сразу, в начале процедуры обработки прерывания установить флаг IF в единицу. В большинстве случаев этк операцию нужно делать как можно раньше. Для установки флага IF в единицу в системе команд микропроцессора есть спецальная команда, не имеющая операндов:
sti – разрешить аппаратные прерывания.
Наиболее наглядный пример, показывающий важность своевременной установки IF, связан с отсчетом времени. Рассмотрим, как ведется учет времени в компьютере. Как после включения компьютер определяет время текущее время суток или как он запоминает информацию о своей конфигурации после выключения? Все дело в том, что компьютер имеет небольшую энергонезависимую память, которая питается от аккумулятора и не зависит от подключения к электросети. Конструктивно эта память выполнена на специальном типе полупроводниковых элементов с так называемой CMOS-структурой (Complementar Metal Oxide Semiconductor – комплиментарная МОП - структура). Особенность таких элементов – в их пониженной по сравнению с обычными микросхемами потребляемой мощности (при этом они являются и более медленными, что в данном случае не отрицательно). Аккумулятор кроме CMOS-памяти питает еще и микросхему системных часов, в функции которой входит отсчет текущих даты и времени суток. Таким образом, текущие значения даты и времени постоянно хранятся в CMOS-памяти и поддерживаются в актуальном состоянии даже после выключения компьютера. Кроме того, в CMOS-памяти хранится некоторая другая информация, в частности, о конфигурации компьютера. Во время загрузки компьютера дата и время считываются в область данных BIOS. Дальнейший отсчет времени, после загрузки системы, ведется с помощью системного таймера – другой микросхемы на системной плате, в функции которой входит регулярно, примерно 18.2 раза в секунду, генерировать сигнал, который в качестве прерывания подается на уровень irq0 контролера прерываний i8259A. Во время работы компьютера соответствующая программа BIOS обрабатывает прерывание данного уровня и ведет счет времени. Если терять такты по этому входу, то фактическое время на часах будет отставать, и поэтому в большинстве случаев в обработчиках прерываний есть смысл, как можно раньше выдавать команду sti.
Обработка прерываний в реальном режиме
Характеристики реального режима работы микропроцессора
Пространство оперативной памяти делится на сегменты по 64 Кбайт. Сегменты в памяти могут перекрываться;
Страничное преобразование адреса запрещено, то есть физический адрес равен линейному и формируется как сумма двух составляющих:
16-разрядного эффективного адреса, который, в свою очередь, является суммой трех составляющих: базы, смещения и индекса;
20-разрядного результата сдвига содержимого конкретного сегментного регистра на 4 разряда влево;
Максимальное значение физического адреса равно0ff fffh, то есть1 Мбайт, но, фактически, в реальном режиме микропроцессора адресуется на 64 Кбайт больше, что следует из следующего вычисления:
Ffff0 – максимальное значение сегментной части адреса, сдвинутое на 4 разряда влево;
+
0fffh – максимальное значение смещения;
10ffef – максимальный физический адрес в реальном режиме.
Этот пример говорит о том, что в модели микропроцессоров, начиная с i286, при определенных обстоятельствах возможна адресация оперативной памяти за пределами первого мегабайта. Это обстоятельство даже использовалось последними версиями MS-DOS для размещения служебных программ в этом дополнительном сегменте памяти. Формирование значений адреса сразу за первым мегабайтом возможно и в микропроцессоре i8088/86. в нем при появлении физического адреса большего 0ffffh, например 1 000 054h, микропроцессор отбрасывает 21-й единичный бит. Происходит так называемое «заворачивание» адреса, поэтому сформированный физический адрес на шине адреса будет равен 00054h. Для того чтобы обеспечить полную эмуляцию данной особенности микропроцессора i8088/86, в моделях микропроцессоров, начиная с i80286, была предусмотрена возможность блокировки адресной линии A20 (управление тем самым 21-м битом адреса). Для обеспечения доступа к адресам оперативной памяти, лежащим за пределами первого мегабайта, необходимо специальным образом открывать эту адресную линию;
В реальном режиме схема распределения оперативной памяти – фиксированная. Перечислим расположение некоторых из системных областей, которые потребуются нам в дальнейшем:
В диапазоне адресов 00000h – 003ffh (первый мегабайт оперативной памяти) находится таблица векторов прерываний (ТВП). Адрес программы прерывания наз. вектором. Она содержит 256 векторов прерываний размером 4 байта (указателей на программы обработки прерываний). В первом слове хранится значение ip, а во втором – cs. Младшие 1024 байт памяти содержат вектора прерываний, таким образом, имеется место для 256 векторов;
В диапазоне адресов 00400h – 006ffh сразу за таблицей векторов прерываний располагается область памяти, содержащая жестко структурированные данные, обеспечивающие работу BIOS и MS-DOS;
С адреса 0b8000h располагается область видеопамяти, в которой формируется изображение, которое мы видим на экране.
Общая схема обработки прерываний в реальном режиме
Обработка прерываний (как внешних, так и внутренних) в реальном режиме микропроцессора производится в три этапа:
Прекращение выполнения текущей программы.
Переход к выполнению и выполнение программы обработки прерываний.
Возврат управления прерванной программе.
Первый этап должен обеспечить временное прекращение выполнения текущей программы таким образом, чтобы потом прерванная программа продолжила свою работу так, как будто никакого прерывания не было. Любая программа, загруженная для выполнения операционной системой, занимает свое, отдельное от других программ, место в оперативной памяти. Разделяемыми между программами ресурсами являются регистры микропроцессоров, в том числе регистр флагов, поэтому их содержимое нужно сохранять. Обязательным для сохранения являются регистры cs, ip и flags \ eflags, поэтому они при возникновении прерывания сохраняются микропроцессором автоматически. Пара cs:ip содержит адрес команды, с которой необходимо начать выполнение после возврата из программы обслуживания прерывания, а flags \ eflags – состояние флагов после выполнения последней команды прерванной программы в момент передачи управления программе обработки прерывания. Сохранение содержимого остальных регистров должно обеспечиваться программистом в начале программы обработки прерывания до их использования. Наиболее удобным методом хранения регистров является стек. В конце первого этапа микропроцессор после включения в стек регистров flags, cs, i сбрасывает бит флага прерываний IF в регистре flags (но при этом в стек записывается предыдущее содержимое регистра flags с еще установленным IF). Тем самым предотвращаются возможность возникновения вложенных прерываний по входу INTR и порча регистров исходной программы вследствие неконтролируемых действий со стороны программы обработки вложенного прерывания. После того как необходимые действия по сохранению контекста завершены, обработчик аппаратного прерывания может разрешить вложенные прерывания командой sti.
Набор действий по реализации второго этапа заключается в определении источника прерывания и вызова соответствующей программы обработки. В реальном режиме микропроцессора допускается от 0 до 255 источников прерываний. Количество источников прерываний ограничено размером таблицы векторов прерываний. Эта таблица выступает связывающим звеном между источником прерывания и процедурой обработки. Данная таблица располагается в памяти, начиная с адреса 0. каждый элемент таблицы векторов прерываний занимает 4 байта и имеет следующую структуру:
1-е слово элемента таблицы – значение смещения начала процедуры обработки прерывания (n) от начала кодового сегмента;
2-е слово элемента таблицы – значение базового адреса сегмента, в котором находится процедура обработки прерывания.
Определить адрес, по которому находится вектор прерывания с номером n, можно следующим образом:
cмещение_элемента_таблицы_векторов_прерываний = n*4
Теперь понятно, что на втором этапе обработки прерывания микропроцессор выполняет следующие действия:
По номеру источника прерывания путем умножения на 4 определяет смещение в таблице векторов прерываний.
Помещает первые два байта по вычисленному адресу в регистр ip.
Помещает вторые два байта по вычисленному адресу в регистр cs.
Передает управление по адресу, определяемому парой cs:ip.
Далее выполняется сама программа обработки прерывания. Она, в свою очередь, также может быть прервана, например, поступлением запроса от более приоритетного источника. В этом случае этапы 1 и 2 будут повторены для вновь поступившего запроса.
Набор действий по реализации этапа 3 заключается в восстановлении контекста прерванной программы. Так же, как и на этапе 1, на данном последнем этапе есть действия, выполняемые микропроцессором автоматически, и действия, задеваемые программистом. Основная задача на этапе 3 – привести стек в состояние, в котором он был сразу после передачи управления данной процедуре. Для этого программист указывает необходимые действия по восстановлению регистров и очистке стека. Этот участок кода необходимо защитить от возможности искажения содержимого регистров (в результате появления аппаратного прерывания) с помощью команды cli. Последние команды в процедуре обработки прерывания – sti и iret, при обработке которых микропроцессор выполняет следующие действия:
sti – разрешить аппаратные прерывания по входу INTR;
iret – извлечь последовательно три слова из стека и поместить их, соответственно, в регистры ip, cs, flags.
В результате этапа 3 управление возвращается очередной команде прерванной программы, которая должна была выполнится, если бы прерывания не было.
Аппаратные прерывания могут быть инициированы программно командой микропроцессора int n, где n – номер аппаратного прерывания в соответствие с таблицей векторов прерываний. При этом микропроцессор также сбрасывает флаг IF, но не вырабатывает сигнал INTA.
Написание собственного прерывания
Имеется несколько причин для написания собственного прерывания. Во-первых, большинство из готовых прерываний, обеспечиваемых операционной системе, ничто иное, как обычные процедуры, доступные для всех программ, поэтому можно добавить что-то свое. Например, многие программы могут использовать процедуру, выводящую строки на экран вертикально. Вместо того, чтобы включать ее в каждую программу в качестве процедуры можно установить ее как прерывание, написав программу, которая останется резидентной в памяти после завершения. Тогда, например, можно использовать int 80h вместо WRITE_VERTICALLY (вызов прерывания несколько медленней, чем вызов процедуры).
Второй причиной написания прерывания может быть использование какого-либо отдельного аппаратного прерывания. Это прерывание автоматически вызывается при возникновении определенных условий. В некоторых случаях BIOS инициализирует вектор этого прерывания так, что он указывает на процедуру, которая вообще ничего не делает (она содержит только iret). Можно написать свою процедуру и изменить вектор прерываний, чтобы он указывал на нее. Тогда при возникновении аппаратного прерывания будет выполняться нами написанная процедура. Одна из таких процедур это прерывание времени суток, которое автоматически вызывается 18,2 раза в секунду. Обычно это прерывание только обновляет показания часов, но можно изменить его код как угодно программисту.
И, наконец, возникает иногда желание написать прерывание, которое полностью заменит одну из процедур ОС, приспособленное к программным нуждам.
Рассмотрим пример разработки прерывания в общем случае.
Функция 25h прерывания 21h устанавливает вектор прерывания на указанный адрес cs:ip. Чтобы установить вектор, указывающий на одну из ваших процедур, нужно поместить сегмент процедуры в ds, а смещение в dx. Затем нужно поместить номер прерывания в al и вызвать функцию. Любая процедура прерывания должна завершаться не обычной инструкцией RET, а IRET (IRET выталкивает из стека три слова, включая регистр флагов, в то время как RET помещает на стек только два, если вы попытаетесь тестировать такую процедуру как обычную процедуру, но кончающуюся IRET, то Вы исчерпаете стек.). Отметим, что функция 25H автоматически запрещает аппаратные прерывания в процессе изменения вектора, поэтому не существует опасности, что посреди дороги произойдет аппаратное прерывание, использующее данный вектор.
Когда программа завершается, должны быть восстановлены оригинальные вектора прерываний. В противном случае последующая программа может вызвать данное прерывание и передать управление на то место в памяти, в котором Вашей процедуры уже нет. Функция 35 прерывания 21H возвращает текущее значение вектора прерывания, помещая значение сегмента в ES, а смещение в BX. Перед установкой своего прерывания получите текущее значение вектора, используя эту функцию, сохраните эти значения, и затем восстановите их с помощью функции 25H (как выше) перед завершением своей программы.
Например:
;---в сегменте данных:
KEEP_CS DW 0 ;хранит сегмент заменяемого прерывания
KEEP_IP DW 0 ;хранит смещение прерывания
;---в начале программы
MOV AH,25H ;функция получения вектора
MOV AL,1CH ;номер вектора
INT 21H ;теперь сегмент в ES, смещение в BX
MOV KEEP_IP,BX ;запоминаем смещение
MOV KEEP_CS,ES ;запоминаем сегмент
; ---в конце программы
CLI
PUSH DS ;DS будет разрушен
MOV DX,KEEP_IP ;подготовка к восстановлению
MOV AX,KEEP_CS ;
MOV DS,AX ;подготовка к восстановлению
MOV AH,25H ;функция установки вектора
MOV AL,1CH ;номер вектора
INT 21H ;восстанавливаем вектор
POP DS ;восстанавливаем DS
STI
Имеется пара ловушек, которых следует избегать при написании прерывания. Если новая процедура прерывания должна иметь доступ к данным, то необходимо позаботиться, чтобы DS был правильно установлен (обычно прерывание может использовать стек вызывающей программы). Другая неприятность может заключаться в том, что при завершении программы по Ctrl-Break вектор прерывания не будет восстановлен, если только Вы не предусмотрите, чтобы программа реакции на Ctrl-Break выполняла эту процедуру.
Список используемой литературы:
«Assembler. Учебник» В.Юров, изд. «Питер», 2000г
«Ассемблер и программирование для IBM PC» Питер Абель, изд. технологический институт «Британская Колумбия»