Номер (код) прерывания |
Функция прерывания |
0 |
Деление на ноль |
1 |
Пошаговая трассировка |
2 |
Немаскируемое прерывание |
3 |
Печать копии экрана |
4 |
Арифметическое переполнение |
5 |
Печать копии экрана |
6 |
Недействительный код операции |
7 |
Сопроцессор не доступен |
На рис. 3.8 IP, CS и Flags — это содержимое соответствующих регистров процессора на момент ухода в программу обработки прерывания («точка возврата»), т.е. эти данные «принадлежат» прерванной программе. После выполнения обработки прерывания содержимое стека извлекается в обратном порядке (IP, CS, Flags). Возврат происходит к следующей команде прерванной программы. Отсюда понятно, в частности, как из программы обработки прерывания получить данные «точки возврата»: можно либо воспользоваться командами работы со стеком, либо командами пересылки данных, предварительно скопировав указатель стека (SP), чтобы потом использовать его как базу для непосредственного обращения к ячейкам.
Особенностью прерывания при делении на ноль (int 0) является передача управления в точку вызова в основной программе. Чтобы избежать "зависания", необходимо в программе обработки позаботиться о переходе на следующую команду, предварительно известив о неприятности пользователя.
Рис. 3.8. Содержимое вершины стека после входа в прерывание
Аналогично запрос на прерывание int 4 — арифметическое переполнение — генерируется при установленных флагах OF и IF (переполнение и разрешение прерывания). Этот запрос инициируется командой условного прерывания при переполнении INTO. Обычно вектор этого прерывания является указателем на команду IRET, тем самым пользователю предоставляется возможность самостоятельно программировать реакцию системы в случае предполагаемой возможности возникновения переполнения.
Чтобы проанализировать работу стандартного обработчика подобных прерываний (например, деления на ноль) достаточно написать программу, создающую ситуацию, при которой это прерывание будет инициировано.
При выполнении заданий, связанных с перехватом логических прерываний, для устранения возврата программы в точку вызова прерывания следует «исправить» адрес возврата из прерывания, воспользовавшись одним из указанных выше приемом.
Прерывания int 1 и int 3 позволяют организовать отладочные режимы пошаговой трассировки и обработки точек останова, что необходимо для создания различного рода отладчиков. Прерывание int 1 происходит при установленном бите Т в регистре флагов. Процессор, выполнив одну команду, переходит на программу обработки прерывания int 1, выполняет команды обработчика, после чего приступает к выполнению следующей команды. Установить и сбросить Т-бит можно непосредственно в теле трассируемой программы. При этом необходимо установить начало и проанализировать условие окончания трассируемого фрагмента. Трассировка другого фрагмента программы потребует редактирования исходного программного кода. Поэтому целесообразно применять точки останова, используя прерывание int 3, и возложить на него функции управления Т-битом. Один из возможных вариантов построения программы для пошагового исполнения приведен на рис. 3.7.
Трассируемый фрагмент помещается между двумя точками останова (int 3). Программа обработки третьего прерывания анализирует состояние Т-бита: если он не установлен, то устанавливает его посредством записи соответствующего слова в стек по адресу сохраняемого регистра флагов вызывающей программы. Сброс происходит аналогичным образом в случае установленного Т-бита при повторном вызове int 3.
В операционной системе DOS прерывания int 1 и int 3 не поддерживаются, программы их обработки содержат только команду возврата iret.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.