Реферат: Системное программирование

ДОКДАД

ПОДИСЦИПЛИНЕ:

«СИСТЕМНОЕПРОГРАММИРОВАНИЕ»

НА ТЕМУ:

«ПРЕРЫВАНИЕ»


Содержание

Прерывание и его природа

Контролер прерываний

Обработка прерываний вреальном режиме

Характеристики реальногорежима работы микропроцессора

Общая схема обработкипрерываний в реальном режиме

Написание собственногопрерывания

Пример разработкипрерывания в общем случае


Прерываниеи его природа

Прерывание – инициируемыйопределенным образом процесс, временно переключающий микропроцессор навыполнение другой программы с последующим возобновлением выполнения прерваннойпрограммы.

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

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

Внешние прерываниявызываются внешними по отношению к микропроцессору событиями. На приведенномниже рис.1 схематически изображена подсистема прерываний компьютера на базе микропроцессораIntel.


Рис.1. Подсистема прерываний компьютера

/>

На рис.1 видно, что умикропроцессора есть два физических контакта – INTR и NMI. На них и формируются внешние по отношению кмикропроцессору сигналы, возрастающие фронты которых извещают микропроцессор отом, что некоторое внешнее устройство просит уделить ему внимание. Вход INTR (Interrupt Request) предназначен для фиксации запросов от периферийныхразличных устройств, например таких, как системные часы, клавиатура, жесткийдиск и т.д. Вход NM1 (NonMaskeable Interrupt) –немаскируемое прерывание. Этот вход используют для того чтобы сообщитьмикропроцессору о некотором событии, требующем безотлагательной обработки, иликатастрофической ошибке. Внешние прерывания относятся, естественно, к непланируемым прерываниям.

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

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

o    Обработкамашинной команды int xx. Этот тип прерываний называется программным. Это –планируемые прерывания, так как с их помощью программист обращается в нужноедля него время за обслуживанием своих запросов либо к операционной системе,либо к BIOS, либо к собственным программам обработки прерываний.

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

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

К аппаратным средствамсистемы прерываний относятся:

o    Выводы микропроцессора:

·                      INTR – вывод длявходного сигнала внешнего прерывания. На этот вход поступает выходной сигнал отмикросхемы контролера прерываний 8259А;

·                      INTA – вывод микропроцессора для выходногосигнала подтверждения получения сигнала прерывания микропроцессором. Этотвыходной сигнал поступает на одноименный вход INTA микросхемы контроллерапрерываний 8259А;

·                      NMI – вывод микропроцессора для входногосигнала немаскируемого прерывания;

o    Микросхемапрограммируемого контроллера прерываний 8259А. она предназначена дляфиксирования сигналов прерываний от восьми различных внешних устройств. В силуее важной роли при работе всей вычислительной системы мы ее подробно рассмотримниже;

o    Внешние устройства:таймер, клавиатура, магнитные диски и.д.

К программным средствамсистемы прерываний реального режима относятся:

o    Таблица векторовпрерываний. В этой таблице в определенном формате, который зависит от режимаработы микропроцессора, содержатся указатели на процедуры обработкисоответствующих прерываний;

o    Следующие флаги врегистре флагов flags\eflags:

·                      IF(Interrupt Flag) – флаг прерывания. Предназначендля так называемого маскирования (запрещения) аппаратных прерываний, то естьпрерываний по входу INTR. На обработку прерываний остальных типов флаг IFвлияния не оказывает. Если IF = 1, микропроцессор обрабатывает внешниепрерывания, если IF = 0, микропроцессор игнорирует сигналы на входе INTR;

·                      TF (Trace Flag) – флаг трассировки. Единичное состояние флага TFпереводит микропроцессор в режим покомандной работы. В режиме покоманднойработы после выполнения каждой машинной команды в микропроцессоре генерируетсявнутреннее прерывание с номером 1, и далее следуют действия в соответствии салгоритмом обработки данного прерывания;

o    Машинные командымикропроцессора: int, into, iret, cli, sti.


Контролерпрерываний

Центральное место в схемеобработки аппаратных прерываний занимает программируемый контроллер прерываний(ПКП), выполненный в виде специальной микросхемы i8259A. Эта микросхема можетобрабатывать запросы от восьми источников внешних прерываний. Этого явно мало,поэтому в стандартной конфигурации вычислительной системы обычно используют двепоследовательно соединенные микросхемы i8259A. В результате такого соединенияколичество возможных источников внешних прерываний возрастает до 15.

Перечислим функции,выполняемые микросхемой контроллера прерываний:

o    Фиксированиезапросов на обработку прерывания от восьми источников, формирование единогозапроса на прерывание и подача его на вход INTR микропроцессора;

o    Формированиеномера вектора прерывания и выдача его на шину данных;

o    Организацияприоритетной обработки прерываний;

o    Запрещение(маскирование) прерываний с определенными номерами.

На рис.2 показаносхематическое представление внутренней структуры и физических выводовмикросхемы i8259A.


Рис.2. Структурная схемаи схематическое представление выводов i8259A.

/>

Рассмотрим назначение основныхструктурных компонентов контроллера прерываний:

o    Регистр запросовна прерывания IRR (Interrupt Request Register) – восьмиразрядный регистр,фиксирующий поступление сигнала на один из входов i8259A – irq0…irq7. фиксация выражается в установкесоответствующего бита в единичное состояние;

o    Регистрмаскирования прерываний IMR (Interrupt Mask Register) – восьмиразрядный регистр, спомощью которого можно запретить обработку запросов на прерывания, поступающихна соответствующие входы (уровни) irq0…irq7. Для запрещения (маскирования)определенных уровней прерываний необходимо установить соответствующие битырегистра IMR. Эта операция осуществляется путем программирования порта 21h.

o    Регистробслуживаемых прерываний ISR (Interrupt ServiceRegister) – восьмиразрядный регистр,единичное состояние разрядов которого показывает, прерывания каких уровнейобрабатываются в данный момент в микропроцессоре;

o    Арбитрприоритетов PR (Priority Resolver) – функцией данного блока являетсяразрешение конфликта при одновременном поступлении запросов на входы irq0…irq7;

o    Блок управления –основной функцией данного блока является организация информационного обменаконтроллера прерываний и микропроцессора через шину данных. На этот блокзамыкаются как выводы d0…d7,так и некоторые другие.

Рассмотрим возможныепрохождение и обработку сигнала прерывания от некоторого внешнего устройства.При этом воспользуемся структурной схемой контроллера прерываний иобозначениями не ней (рис.2).

Допустим, на вход irq0поступает сигнал прерывания, что приводит к установке нулевого бита регистраIRR. Этот регистр связан с регистром маски IMR, состояние битов которогоопределяет, какие уровни прерываний запрещены (единичные биты) или разрешены кобработке (нулевые биты). Управление данным регистром осуществляется через порт21h. Таким образом, если бит 0 в IMR равен нулю, то прерывание уровня 0разрешено. Далее сигнал поступает к арбитру приоритетов. Как мы уже отметили,функция этого блока – разрешение конфликтов при одновременном поступлении запросовна несколько уровней. Обычно самый высокий приоритет у уровня irq_0, и далееуменьшается с возрастанием номера уровня. Если конфликта нет, то сигналпоступает на схему управления контроллером прерываний, которая формирует сигнална выводе int. Этот вывод связан со входом микропроцессора INTR. Таким образом, сигнал на входеi8259A достиг микропроцессора. Отметим важные моменты на этом этапе:

1.        Анализируетсяфлаг IF. Единичное состояние этого флага говорит о том, что аппаратныепрерывания разрешены, нулевое – запрещены.

2.        Если прерываниязапрещены, то запрос на прерывание «повисает» до момента установки IF вединицу.

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

o         Сбрасывает флагIF в ноль;

o         Формирует сигналподтверждения прерывания на выводе микропроцессора INTR. Этот выводмикропроцессора замкнут на одноименный вывод микросхемы i8259A.

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

1.        Сбрасывает бит врегистре IRR, соответствующий уровню прерыванияirq_0.

2.        Устанавливает в 1бит 0 регистра ISR, тем самым фиксируя факт обработки прерывания уровня 0 вмикропроцессоре.

3.        Формирует спомощью блока управления номер вектора прерывания, значение которогоформируется в буфере данных и далее поступает на выводы 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.


Обработкапрерываний в реальном режиме

Характеристики реальногорежима работы микропроцессора

o    Пространствооперативной памяти делится на сегменты по 64 Кбайт. Сегменты в памяти могутперекрываться;

o    Страничноепреобразование адреса запрещено, то есть физический адрес равен линейному иформируется как сумма двух составляющих:

·                               16-разрядногоэффективного адреса, который, в свою очередь, является суммой трехсоставляющих: базы, смещения и индекса;

·                               20-разрядногорезультата сдвига содержимого конкретного сегментного регистра на 4 разрядавлево;

o    Максимальноезначение физического адреса равно0ff fffh, то есть1 Мбайт, но, фактически, в реальном режиме микропроцессораадресуется на 64 Кбайт больше, что следует из следующего вычисления:

Ffff0 – максимальное значение сегментнойчасти адреса, сдвинутое на 4 разряда влево;

+

0fffh – максимальноезначение смещения;

10ffef – максимальныйфизический адрес в реальном режиме.

Этот пример говорит отом, что в модели микропроцессоров, начиная с i286, при определенныхобстоятельствах возможна адресация оперативной памяти за пределами первого мегабайта.Это обстоятельство даже использовалось последними версиями MS-DOS дляразмещения служебных программ в этом дополнительном сегменте памяти.Формирование значений адреса сразу за первым мегабайтом возможно и вмикропроцессоре i8088/86. в нем при появлении физического адреса большего0ffffh, например 1 000 054h, микропроцессор отбрасывает 21-й единичный бит. Происходит такназываемое «заворачивание» адреса, поэтому сформированный физический адрес нашине адреса будет равен 00054h. Для того чтобы обеспечить полную эмуляциюданной особенности микропроцессора i8088/86, в моделях микропроцессоров,начиная с i80286, была предусмотрена возможность блокировки адресной линии A20(управление тем самым 21-м битом адреса). Для обеспечения доступа к адресам оперативнойпамяти, лежащим за пределами первого мегабайта, необходимо специальным образомоткрывать эту адресную линию;

o    В реальном режимесхема распределения оперативной памяти – фиксированная. Перечислим расположениенекоторых из системных областей, которые потребуются нам в дальнейшем:

·          В диапазонеадресов 00000h – 003ffh(первый мегабайт оперативной памяти) находится таблица векторов прерываний(ТВП). Адрес программы прерывания наз. вектором. Она содержит 256 векторовпрерываний размером 4 байта (указателей на программы обработки прерываний). Впервом слове хранится значение ip, аво втором – cs. Младшие 1024 байт памяти содержат вектора прерываний, такимобразом, имеется место для 256 векторов;

·          В диапазонеадресов 00400h – 006ffhсразу за таблицей векторов прерываний располагается область памяти, содержащаяжестко структурированные данные, обеспечивающие работу BIOS и MS-DOS;

·          С адреса 0b8000hрасполагается область видеопамяти, в которой формируется изображение, котороемы видим на экране.

Общая схема обработкипрерываний в реальном режиме

Обработка прерываний (каквнешних, так и внутренних) в реальном режиме микропроцессора производится в триэтапа:

1.        Прекращениевыполнения текущей программы.

2.        Переход квыполнению и выполнение программы обработки прерываний.

3.        Возвратуправления прерванной программе.

Первый этап долженобеспечить временное прекращение выполнения текущей программы таким образом,чтобы потом прерванная программа продолжила свою работу так, как будто никакогопрерывания не было. Любая программа, загруженная для выполнения операционнойсистемой, занимает свое, отдельное от других программ, место в оперативнойпамяти. Разделяемыми между программами ресурсами являются регистрымикропроцессоров, в том числе регистр флагов, поэтому их содержимое нужносохранять. Обязательным для сохранения являются регистры cs, ip и flags \ eflags,поэтому они при возникновении прерывания сохраняются микропроцессоромавтоматически. Пара cs:ipсодержит адрес команды, с которой необходимо начать выполнение после возвратаиз программы обслуживания прерывания, а flags \ eflags – состояние флагов послевыполнения последней команды прерванной программы в момент передачи управленияпрограмме обработки прерывания. Сохранение содержимого остальных регистровдолжно обеспечиваться программистом в начале программы обработки прерывания доих использования. Наиболее удобным методом хранения регистров является стек. В концепервого этапа микропроцессор после включения в стек регистров flags, cs, iсбрасывает бит флага прерываний IF в регистре flags (но при этом в стек записываетсяпредыдущее содержимое регистра flags с еще установленным IF). Тем самымпредотвращаются возможность возникновения вложенных прерываний по входу INTR ипорча регистров исходной программы вследствие неконтролируемых действий состороны программы обработки вложенного прерывания. После того как необходимыедействия по сохранению контекста завершены, обработчик аппаратного прерыванияможет разрешить вложенные прерывания командой sti.

Набор действий по реализациивторого этапа заключается в определении источника прерывания и вызовасоответствующей программы обработки. В реальном режиме микропроцессорадопускается от 0 до 255 источников прерываний. Количество источников прерыванийограничено размером таблицы векторов прерываний. Эта таблица выступаетсвязывающим звеном между источником прерывания и процедурой обработки. Даннаятаблица располагается в памяти, начиная с адреса 0. каждый элемент таблицывекторов прерываний занимает 4 байта и имеет следующую структуру:

o    1-е словоэлемента таблицы – значение смещения начала процедуры обработки прерывания (n) от начала кодового сегмента;

o    2-е словоэлемента таблицы – значение базового адреса сегмента, в котором находитсяпроцедура обработки прерывания.

Определить адрес, покоторому находится вектор прерывания с номером n, можно следующим образом:

cмещение_элемента_таблицы_векторов_прерываний= n*4

Теперь понятно, что навтором этапе обработки прерывания микропроцессор выполняет следующие действия:

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

2.        Помещает первыедва байта по вычисленному адресу в регистр ip.

3.        Помещает вторыедва байта по вычисленному адресу в регистр cs.

4.        Передаетуправление по адресу, определяемому парой cs:ip.

Далее выполняется самапрограмма обработки прерывания. Она, в свою очередь, также может быть прервана,например, поступлением запроса от более приоритетного источника. В этом случаеэтапы 1 и 2 будут повторены для вновь поступившего запроса.

Набор действий пореализации этапа 3 заключается в восстановлении контекста прерванной программы.Так же, как и на этапе 1, на данном последнем этапе есть действия, выполняемыемикропроцессором автоматически, и действия, задеваемые программистом. Основнаязадача на этапе 3 – привести стек в состояние, в котором он был сразу послепередачи управления данной процедуре. Для этого программист указываетнеобходимые действия по восстановлению регистров и очистке стека. Этот участоккода необходимо защитить от возможности искажения содержимого регистров (врезультате появления аппаратного прерывания) с помощью команды cli. Последниекоманды в процедуре обработки прерывания – sti и iret,при обработке которых микропроцессор выполняет следующие действия:

1)        sti – разрешить аппаратные прерывания повходу INTR;

2)        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 выполняла этупроцедуру.


Списокиспользуемой литературы:

 

1)        «Assembler. Учебник» В.Юров, изд. «Питер»,2000г

2)        «Ассемблер ипрограммирование для IBM PC» Питер Абель, изд. технологический институт «БританскаяКолумбия»

еще рефераты
Еще работы по информатике, программированию