Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема2.7 Команды прерывания. 1.Команды безусловного прерывания. 2. Команды условного прерывания




Тема2. 7 Команды прерывания

1. Команды безусловного прерывания

2. Команды условного прерывания

 

Команды прерывания позволяют воспользоваться встроенными системными ресурсами из программы пользователя. Под системными ресурсами понимаются программы, входящие в главную исполнительную программу ЭВМ, которая называется BIOS – базовая система ввода-вывода. В функции этой системы входит: запоминание символов, набираемых на клавиатуре, изображение символов на экране дисплея, обмен данными между устройствами, присоединенными к ЭВМ: дисководами, принтером и т. п. Чтобы обратиться к этим возможностям ЭВМ, пользовательская программа должна быть прервана и выполнена системная функция, а затем выполнение пользовательской программы должно быть продолжено со следующей после обращения к системным функциям команды. Эти функциональные возможности и выполняют команды прерывания, которые описаны в таблице.

 

Мнемокод Формат
INT INT тип_прерывания
INTO INTO
IRET IRET

 

В команде прерывания INT тип_прерывания представляет собой номер прерывания, которых в ЭВМ IBM насчитывается 256 (типы прерываний имеют номера 0-255):

- тип 0 – возникает при делении на 0 или если частное от деления превышает разрядную сетку;

- тип 1 – действует в режиме “трассировки” ( после выполнения каждой команды программы происходит останов);

- тип 2 – немаскируемые технические прерывания;

- тип 3 - прерывания по команде INT, включенной в программу (вызывает останов и отображение содержимого регистров микропроцессора);

- тип 4 – прерывание по команде INTO, включенной в программу (выполняется при условии, что при выполнении предыдущей команды произошло переполнение разрядной сетки);

- типы 8-15 – аппаратные прерывания, инициируемые внешними устройствами;

- типы 16- 31 – планируемые программные прерывания BIOS;

- типы 32-255 – программные прерывания DOS.

В некоторых типах прерываний BIOS и DOS имеется много разновидностей, иногда более 10. Так, прерывание 33 (21Н) имеет около 100 разновидностей (это прерывание наиболее часто используется в программах пользователя). В таких случаях вид прерывания (внутри типа) определяется содержимым регистра AH.

 

Каждому прерыванию в памяти ЭВМ соответствует вектор прерывания (эти вектора размещены в оперативной памяти, начиная с нулевого адреса). Каждый вектор прерывания размещается в 32-битовой ячейке памяти и представляет собой адрес, по которому размещена собственно программа прерывания. По сути такие программы очень похожи на процедуры, отличие в том, что программа прерывания заканчивается командой возврата IRET.

При выполнении команды INT микропроцессор производит следующие действия:

1) помещает в стек регистр флагов;

2) обнуляет флаг трассировки TF и флаг включения-выключения прерываний IF для блокировки других действий, кроме обработки вызванного прерывания;

3) помещает в стек значение регистра CS;

4) вычисляет адрес вектора прерываний, умножая номер_прерывания на 4 (т. к. вектор прерывания занимает 4 байта или 32 бита);

5) обращается ко второму слову из вычисленного адреса вектора прерываний и помещает его в регистр CS;

6) помещает в стек значение указателя команд IP;

7) загружает в IP первое слово вектора прерываний.

После выполнения всех этих действий в стеке окажутся значения регистра флагов, адреса сегментного регистра CS и смещение команды, следующей за командой прерывания IP. Пара регистров CS: IP будут указывать на начальный адрес программы обработки прерывания, которую микропроцессор и начнет выполнять. Например, по команде

INT 1АН

Микропроцессор определит вектор прерывания, равным 68Н и далее будет получать значения указателя команд IP для программы прерывания из ячейки 68Н, а значение сегментного регистра кодов CS - из ячейки 6АН, нижеприведенный рисунок иллюстрирует изменения, производимые командой INT в стеке.

 

 

SP
01FE
                                  

стек Адреса ячеек стека
  SS: 01F8
  SS: 01FA
  SS: 01FC
  SS: 01FE

 

 

IP
CS
01FE

 

 


Рисунок 1 - Перед исполнением команды INT (длина команды 2 байта)

 

SP
01F8
                             

стек Адреса ячеек стека
   
SS: 01F8
049Е SS: 01FA
Флаги SS: 01FC
  SS: 01FE

 

Векторы прерывания
F000
Адреса ячеек памяти

 
 
FE6E
F000 006А
  006С

IP
FE6E
CS

 

 

                                                  

Рисунок 2 – После выполнения команды INT

 

Команда INTО представляет собой команду условного прерывания. Она инициирует прерывание в том случае, когда флаг переполнения OF равен 1. Следовательно, применять эту команду надо после арифметических операций, которые могут вызвать переполнение. Однако обрабатываться прерывание будет только при наличии переполнения, при отсутствии эта команда будет игнорироваться. Команда INTО вызывает команду обработки по вектору прерывания 4, для определения выполняемых командой действий необходимо обратиться к техническому руководству для конкретной ЭВМ. Для микропроцессора 8088 выбор действий по обработке ситуаций переполнения возлагается на пользователя, а в Ассемблере для Пентиума я не нашла аналогичной команды. Поэтому без дополнительного уточнения пользоваться этой командой не рекомендую.

Команда IRET, как было уже сказано, является командой возврата после прерывания. Она извлекает из стека значения регистров CS и IP и регистра флагов (считывает 3 ячейки стека), а затем микропроцессор по новому содержанию регистров команд продолжит выполнение программы пользователя.

Наиболее распространенным в программах пользователя является использование прерывания 21H, которое предназначено для вызова функций BIOS. В нижеприведенной таблице описываются только некоторые из этих функций.

 

 

Таблица

Наиболее часто используемые виды прерывания 21Н

Значе-ние АН Операция Дополнительные входные регистры Выходные регистры
Ожидание набора символа на клавиатуре с последующим изображением его на экране Не используются (AL) = символ
Вывод символа на экран (DL)= ASCII-код символа Не использу-ются
Чтение символа с клавиатуры (DL)=0FFH (AL) = символ
A Чтение клавиатурной строки в буфер (DS: DX)= адрес буфера, первый байт = размер буфера Второй байт буфера = число про-читанных символов
Изображение строки на экране дисплея (DS: DX)= адрес строки, которая должна заканчиваться символом $ Не используются

 

Рассмотрим некоторые примеры их использования.

В диалоговых программах пользователя нередко требуется дать ответ на приглашение к вводу или сделать выбор из меню, нажав букву или цифру. Предположим, что в программе требуется дать ответ Д или Н на вопрос о продолжении или прекращении программы. Ввод Д заставляет программу перейти к группе команд, помеченных как YES, а Y – к командам с меткой NO. При ошибочном нажатии какай либо другой клавиши программа возвращается на ввод символа до тех пор, пока не будет нажата либо Д, либо Н.

GET_KEY MOV AH, 1            ; считать символ

                INT 21H

                CMP AL, ’Д’ ; считан Д?

                JE YES     ; если да. То перейти к YES

                CMP AL, ’Н’ ; считан Н?

                JE NO       ; если да, то перейти к YES

                JNE GET_KEY; иначе возврат на чтение символа.

В приведенном фрагменте распознаются только прописные буквы Д и Н, если Вы хотите, чтобы распознавались и строчные буквы, добавьте в программу соответствующие команды!

Во многих приложениях, требуется, чтобы пользователь веел строку с информацией, например, свое полное имя (ФИО). Для этой цели служит функция А прерывания 21. Чтобы воспользоваться этой функцией, в программе пользователя требуется зарезервировать в сегменте данных место лдля вводимой строки ( в таблице это называется буфер строки). Количество выделяемых байтов должно быть на 2 больше максимального размера вводимой строки. Причем первый байт буфера должен задавать эту самую максимальную длину (фактически он будет содержать значение количества выделенных байтов памяти минус 2). Например, чтобы предусмотреть в программе ввод пользовательской строки из 50 символов, в сегменте данных нужно описать:

STRING  DB 50, 51 DUP (? )

Чтение строки выполняется командами:

       LEA DX, STRING ; указатель ан буфер поместить в DS: DX

       MOV AH, 0AH        ; вызвать функцию А

       INT 21H               ; прочитать строку

Функция А помещает количество фактически введенных символов вво второй байт буфера STRING и не изменяет указатель DS: DX. Т. е. после выполнения команды INT первый информационный символ введенной строки находится по адресу (DX)+2.

Вряд ли хорошая пользовательская программа может обойтись без сообщений из программы. Это могут быть либо приглашения к вводу информации, либо сообщения о ходе выполнения программы. Такой сервис в программах на Ассемблере представляет функция 9 для работы с дисплеем. Приведем пример фрагмента программы для выдачи приглашения ‘Введите ФИО’. Для функции 9 необходимо, чтобы текст сообщения заканчивался символом $, поэтому в сегменте данных опишем:

MESS1             DB ‘Введите ФИО: $’

В командном сегментном коде предусмотрим команды вызова функции 9:

       LEA DX, MESS1

       MOV AH, 9

       INT 21H

Имейте ввиду, что в этом случае курсор устанавливается в позицию $, т. е. в то место строки, где мы хотим видеть фамилию. Чтобы после выдачи приглашения курсор установился в начале следующей строки, необходимо в текст выдаваемого приглашения перед символом доллара. Ввести символы возврата каретки и перехода на следующую строку, как это демонстрируется ниже:

MESS1             DB ‘Введите ФИО’, 0DH, 0AH, ’$’

Вывод числовых значений на экран дисплея осуществляется с использованием функции 2 прерывания 21Н.

Чтобы воспользоваться этой функцией, необходимо учесть, что десятичная цифра отличается от символа этой цифры на 30h, в чем легко убедиться, изучив таблицу кодов ASCII. Например, если искомый максимальный элемент записан в переменную max, то фрагмент программы для его вывода на экран дисплея может быть следующим:

tcifra:   mov       dl, max

add      dl, 30h

mov              ah, 02h

int       21h

Приведенный фрагмент программы применим в случае, если максимальное значение элемента (max) является однозначным. Если элементы массива двухзначные (лежат в диапазоне от 10 до 99), то сначала необходимо выделить отдельные цифры, а затем последовательно их распечатать:

dwe_tcifr:      mov       al, max

cbw    ; преобразуем байт в полное слово

div byte ptr c; константа с объявлена в сегменте данных как c db 10

mov              r, ah; запоминаем младшую цифру в r, переменная r объявлена в сегменте данных как r db?

mov              dl, al     ; старшую цифру помещаем в dl

add      dl, 30h  ; преобразуем цифру в символ

mov              ah, 02h           ; и выводим ее на экран

int       21h

mov              dl, r      ; младшую цифру помещаем в dl

add      dl, 30h           ; и выводим ее на экран

int       21h

При реализации вывода следует учесть, что обращение к прерыванию int            21h изменяет содержание регистра АХ (“портит” регистр АХ), поэтому значения из этого регистра, которые будут обрабатываться далее в программе, необходимо сохранить в другом регистре или ячейке памяти.

Желательно включить в программу оба вышеприведенных фрагмента совместно с анализом результата, как показано ниже:

сmp              max, c   ; сравниваем значение тах с 10

jl         tcifr      ; если меньше, то одна цифра

dwe_tcifr:      mov       al, max ; иначе две цифры

далее по тексту фрагмент программы для вывода двух цифр

. . . . . . . ..

jmp     kon_wyw

tcifra:   mov       dl, max

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...