Newline. pop ax; Восстановление регистров
pop ax; Восстановление регистров
pop dx
pop ds
iret ; Возврат из прерывания
code ends
end start
Обратите внимание, что при выполнении некоторых групп команд работу нашей программы нельзя прерывать, иначе может возникнуть ситуация, когда в вектор прерывания не занесётся полностью вся необходимая информация, а уже произойдёт переключение на другую программу по пришедшему сигналу прерывания. В программировании такие группы команд называются критическими секциями программы. В нашей программе критические сеции заключены в рамки, в начале каждой критической секции стоит команда запрета прерывания от внешних устройств cli , а в конце секции – команда открытия прерываний sti .
После выдачи диагностики об ошибке наша процедура-обработчик может не продолжать выполнение программы, а, например, завершать выполнение программы. Для этого вместо предложения
iret ; Возврат из прерывания
надо поставить два предложения
addSP,3*2; Очистка стека от IP, CS и FLAGS
jmpVoz
И, наконец, рассмотрим команду, которая всегда вызывает прерывание с номером N, заданным в качестве её операнда:
int op1
Здесь op1 имеет формат i8. Заметим, что с помощью этой команды можно вызвать прерывание с любым номером, например прерывание, соответствующее делению на ноль или плохому коду операции. Более того, прерывания с номерами большими 31, в нашей архитектуре можно вызвать, только выполняя команду int с соответствующим параметром-номером прерывания. Используя эти команды, легко отлаживать процедуры-обработчики прерываний, но основное назначение таких команд состоит в другом.
Дело в том, что в большинстве программ необходимо выполнять некоторые широко распространённые действия (обмен данными с внешними устройствами, выполнение стандартных процедур и многое другое). Обычно процедуры, реализующие эти действия, оформляются в виде библиотеки стандартных процедур и всегда находятся в оперативной памяти компьютера. Так как адреса этих процедур часто меняются, то лучше всего присвоить каждой такой процедуре свой номер N и оформлять такие процедуры в виде обработчиков прерываний с этим номером. В этом случае вызов конкретной процедуры с номером N следует производить командой intN .
Исходя из описанного выше, такие команды прерывания (а часто и соответствующие им процедуры) обычно называют системными вызовами (системными функциями операционной системы), а библиотека стандартных процедур – Базовой системой процедур ввода/вывода (английское сокращение – BIOS). Параметры для таких процедур обычно передаются на регистрах, т.е. для системных вызовов не выполняются стандартные соглашения о связях.
В качестве примера рассмотрим системный вызов int 21h , который реализует многие операции ввода/вывода. Так, для вывода строки текста на экран в качестве параметров следует передать номер конкретного действия на регистре ah (для вывода строки ah=9) и адрес начала выводимой строки на регистрах ds:dx (строка должна кончаться символом '$'). Исходя из этого на место нашей макрокоманды вывода строки текста
Outstr
можно подставить команды
mov ah,9
int 21h
В качестве примера опишем на Ассемблере процедуру, использующую системный вызов. Эта процедура при её вызове выдаёт звуковой сигнал:
Beep proc
push ax
push dx
mov al,7; символ-звуковой сигнал
mov ah,02h; номер функции вывода символа
int21h; системный вызов
pop dx
pop ax
Ret
Beep endp
Можно заметить, что наша процедура Beep при своём вызове выполняет те же действия, что и макрокоманда outch 7 .
В дальнейшем мы познакомимся ещё с одним важным назначением системных вызовов при изучении мультипрограммного режима работы ЭВМ.
Процедуры обработки прерываний реализуют особый стиль программирования, их иногда называют процедурами обратного вызова (call back procedure) или процедурами-демонами. Такая процедура при своей инициализации (размещении в памяти) оставляет в определённом месте адрес своего начала. Далее вызов этой процедуры производится при возникновении соответствующих условий путём (дальнего) косвенного перехода на эту процедуру.
В качестве примера рассмотрим рассчёт платы за междугородний телефонный разговор, при которым за каждую новую минуту разговора к общей сумме прибавляется некоторая величина – тариф за минуту разговора с данным городом. При наступлении льготного времени (обычно ночью и в выходные дни) срабатывает будильник (специальная системная программа-обработчик прерываний от встроенного в ЭВМ таймера), который вызывает процедуру-демона пересчёта всех тарифов. Заметим, что в некоторые языки высокого уровня включены аналогичные возможности, например, в языке С можно писать так называемые функции-реакции на сигналы, о чём Вы узнаете в следующем семестре в курсе "Системное программное обеспечение".
В заключении нашего по необходимости краткого рассмотрения прерываний заметим, что появление в компьютерах системы прерываний было, несомненно, одним из важнейших событий в развитии архитектуры вычислительных машин. Недаром появившиеся компьютеры с системой прерываний стали относить к следующему, третьему поколению ЭВМ. Подробнее об этом можно прочитать в книге [3].
Дата добавления: 2015-10-05; просмотров: 618;