Предыдущий раздел | ПРЕРЫВАНИЯ И РЕЗИДЕНТНЫЕ ПРОГРАММЫ | Следующая глава |
Третий тип прерываний – программные прерывания (термин неудачный, но общепринятый). Причиной такого прерывания является сама программа (отсюда и название), а именно – попадание на ЦП машинной команды “int n”, где n – номер прерывания. Подобно исключениям программные прерывания являются синхронными к текущей работе ЦП, так как обслуживают выполняемую на нем программу. Но в отличие от исключений, моменты возникновения которых автору прикладной программы заранее не известны, команды int помещаются программистом в текст программы сознательно с целью выполнения системных вызовов.
Более того, следует четко представлять себе, что в однопрограммной ВС не существует иного способа вызова из прикладной программы системных управляющих подпрограмм (ОС или BIOS) кроме применения команды программного прерывания int.
Примером системного вызова DOS является команда “int 21h”. Особенностью этого вызова является то, что под номером 21h «скрывается» программное прерывание, инициирующее диспетчер функций DOS. Эта подпрограмма обрабатывает огромное большинство системных вызовов, адресованных DOS из обрабатывающих программ. Для того чтобы диспетчер функций понял, какую внутреннюю процедуру DOS ему следует вызвать, в прикладной программе следует задать номер требуемой функции (в регистре AH), а если этого недостаточно, то и номер подфункции (в регистре AL).
Как и процедура, обработчик программного прерывания имеет входные и (или) выходные параметры. Для их передачи используются регистры данных и, возможно, стек программы. Использование стека менее предпочтительно, так как входные параметры будут в нем «пригружены» адресом возврата и содержимым регистра FLAGS. А выходные параметры должны быть «пригружены» этими же данными самим обработчиком, так как иначе адрес возврата не будет найден. Несмотря на то, что перечисленные трудности устраняются программой с помощью простых команд push и pop, на их выполнение требуются дополнительные затраты времени ЦП.
Команды программного прерывания int могут применяться не только для реализации системных вызовов, но и для реализации вызова прикладных подпрограмм. Реализация прикладной подпрограммы не в виде процедуры, а в виде обработчика прерываний целесообразна только тогда, когда эта подпрограмма вызывается не из одной, а из нескольких прикладных программ. Только в этом случае удается сократить размер прикладных программ за счет того, что в их код не будет включен код подпрограммы. (При использовании процедуры, наоборот, ее код должен быть включен в код каждой программы, использующей ее.) Реализация подобного вызова подпрограмм требует, чтобы они были резидентны, то есть постоянно находились бы в ОП. В противном случае выполнение каждой прикладной программы, использующей подпрограмму, должно было бы предваряться инициализацией соответствующего обработчика прерываний, что очень неудобно. Вопросы разработки резидентных программ будут рассмотрены в п.19.2. Там же будет приведен пример обработчика программных прерываний.
Наряду с процедурами обработчики программных прерываний относятся к подпрограммам. Поэтому команда вызова такой подпрограммы int очень похожа на команду дальнего вызова процедуры call, а команда завершения обработчика прерываний iret – на команду возврата из дальней процедуры – ret. Работа данных команд будет рассмотрена далее совместно с другими этапами общего алгоритма обработки прерываний.
Предыдущий раздел | В начало | Следующая глава |