Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 167

Unknown Author

Как используется вектор прерываний? Устройство, в котором произошло событие, достойное внимания ОС, посылает в ЦП не только сигнал прерывания, но и номер этого прерывания (устройства, конечно, знают номера своих прерываний). Если это номер i, тогда ЦП, сохранив в стеке регистр флагов и адрес прерывания, просто напросто передает управление по адресу из i-ro элемента вектора прерывания, делая тем самым переход на i-ю ПОП, которая и начинает заниматься обработкой данного прерывания.

ПОП - это в общем-то обычная процедура. В частности, если она должна использовать какие-то регистры, то, как и все "порядочные” процедуры, она в начале своей работы спасает в стеке (прерванной программы или своем внутреннем) значения этих регистров, а в конце работы восстанавливает их. Поэтому, когда будет возобновлена работа прерванной программы, в регистрах останутся те же значения, которые были в них в момент прерывания.

И, наконец, последнее уточнение. Когда ПОП закончит свою работу, она должна возобновить работу прерванной программы. Как это сделать? Очень просто: из стека надо считать три слова и восстановить по ним регистры IP и CS (загрузка в эти регистры адреса и означает переход по этому адресу) и регистр флагов. Для осуществления этих действий в систему команд ПК введена команда ’’возврат из прерывания” (interrupt return) без операндов:

IRET

Ее действие: стек -> IP, стек -> CS, стек -> Hags. Этой командой процедуры обработки прерываний и завершают свою работу.

Итак, что произошло? Прежние значения всех регистров сохранены, прежние состояния всех флагов восстановлены, управление передано на ту команду прерванной программы, которую ЦП из-за прерывания не успел выполнить ранее. А это значит, что данная программа продолжит свою работу так, как будто бы и не было прерывания.

13.2.2. Функции DOS

Рассмотренный механизм прерываний первоначально был предназначен для того, чтобы ОС могла следить за событиями во внешних устройствах ЭВМ (в принтере, дисководах и др.). Но затем поняли, что этот механизм можно использовать и в других целях.

Например, с его помощью можно реагировать на события, происходящие в самом ЦП. Пусть, к примеру, при выполнении какой-то программы встретилась команда деления на 0. Ясно, что это ошибка и на нее надо как-то реагировать. И делается это так: тот блок ЦП, который реализует операцию деления, обнаружив, что делитель равен 0, вырабатывает сигнал прерывания с определенным номером. Дальнейшие же события, несмотря на то, что сигнал прерывания послал сам себе ЦП, идут по рассмотренной схеме, а потому вызывается соответствующая ПОП из ОС, которая выдает на экран сообщение об ошибке "деление на 0", прекращает выполнение программы и передает управление на ту часть ОС, которая осуществляет прием и выполнение приказов пользователя.