Некоторое время мы разобрались с одним “страшным” словом, которое часто используется в ассемблере - с регистрами. Сегодня очередь другого страшного слова - прерывания.
Почему страшное? Ну не знаю… Меня эти слова в своё время пугали, потому что я их не понимал. Что это за прерывания такие, что они прерывают…
А здесь всё просто.
Допустим, у нас работает какая-то программа - выполняет поочерёдно инструкции одну за одной. То есть всё идёт по плану, как и задумано программистом.
Но вдруг происходит что-то неожиданное, например, пользователь нажимает клавишу на клавиатуре или срабатывает какой-то датчик. Это событие как бы внеплановое, но его надо обработать. То есть программа должна как-то отреагировать на событие. Тогда и происходит ПРЕРЫВАНИЕ программы. При этом обычно:
- Запоминаем данные, с которыми работала программа (обычно сохраняем значения основных регистров)
- Прерываем работу программы и запоминаем адрес, на котором мы приостановили программу
- Выполняем обработчик прерывания (то есть какой-то исходный код, который должен выполняться при возникновении прерывания)
- Восстанавливаем регистры, с которыми работала программа до прерывания
- Продолжаем выполнять программу с той точки, где мы её прервали
Но прерывания могут происходить не обязательно по какому-то событию. Они могут быть и “плановыми”. Но в этом случае они всё равно называются прерываниями, потому что они прерывают работу программы, выполняют какое-то действие, и возвращают управление в точку прерывания.
По сути вызов процедуры тоже является прерыванием.
Кроме того, в ассемблере существуют так называемые “стандартные” прерывания, обработчики для которых уже имеются в операционной системе или в BIOS. Для таких прерываний не требуется писать собственный обработчик - достаточно указать номер прерывания и некоторые параметры (если необходимо).
Например, прерывание под номером 21h выполняет функцию операционной системы DOS, номер которой предварительно надо записать в регистр AH. Например, функция номер 9 выводит строку на экран (пример см. здесь).