4891
Аппаратное и программное прерывание
Практическая работа
Информатика, кибернетика и программирование
Прерывания Команды прерывания Различают два вида прерываний – аппаратные прерывания и программные прерывания. Аппаратное прерывание – это сигнал от любого устройства системы для процессора, который по этому сигналу должен обслужить д...
Русский
2012-11-28
75.5 KB
51 чел.
Прерывания
Различают два вида прерываний аппаратные прерывания и программные прерывания. Аппаратное прерывание это сигнал от любого устройства системы для процессора, который по этому сигналу должен обслужить данное устройство. Программное прерывание создается программами BIOS или DOS для вызова сервисных подпрограмм. Программное прерывание вырабатывается специальной микросхемой контроллером прерываний, который посылает сигнал процессору на приостановку выполнения текущей программы и переход к выполнению программы прерывания.
Команды прерывания позволяют вызывать процедуры обслуживания прерываний из программ так же как это сделало бы устройство. Программные прерывания имитируют действие аппаратных прерываний.
INT (тип прерывания)
Команда INT (прерывание) инициирует выполнение процедуры обработки прерывания, определенного в операнде "тип прерывания". Эта команда сохраняет в стеке регистр флагов, очищает флаги TF и IF для запрещения пошагового выполнения и маскируемых прерываний. Флаги сохраняются в том же формате, что и в команде PUSHF. Затем в стеке сохраняется текущее содержимое регистра сегмента кода CS, вычисляется адрес вектора прерывания путем умножения "типа прерывания" на четыре, и второе слово этого вектора помещается в регистр сегмента кода CS. Далее в стеке сохраняется текущее содержимое счетчика команд IP, и в этот регистр записывается первое слово вычисленного вектора прерывания.
Рисунок 15 Вызов обработчика прерывания
INTO
Команда INTO (прерывание при переполнении) генерирует программное прерывание, если установлен флаг переполнения (OF), в противном случае управление передается следующей команде. Вектор прерывания INTO расположен по адресу 10h. Действие этой команды аналогично действию команды INT.
IRET
Команда IRET (возврат из прерывания) возвращает управление в точку, откуда прерывание было вызвано, заполняя из стека регистры IP, CS и регистр флагов. Команда IRET используется для выхода из процедур обработки как программных, так и аппаратных прерываний.
При написании программ для 16-разрядного режима можно использовать прерывание int 21h, предназначенное для вызова функций DOS. Существует около 90 различных функций. Номер функции предварительно помещается в регистр AH. Каждая функция использует входные параметры, передающиеся через регистры, которые должны быть проинициализированы перед вызовом прерывания int 21h. Рассмотрим несколько групп функций DOS: функции ввода, функции вывода, функции даты и времени.
Рассмотрим некоторые функции DOS, которые используются для вывода символьной информации на экран. Далее указывается номер функции и описание функции с примером использования. Средства DOS позволяют выводить на экран только черно-белый текст, возможности позиционирования текста на экране ограничиваются использованием символов возврата каретки (0Dh) и перевода строки (0Ah).
Вывод символа (02h)
Функция посылает символ на стандартное устройство вывода. В регистр DL помещается выводимый символ. Регистр AL модифицируется системой DOS. Если в процессе вывода символа на экран с клавиатуры поступает код <CTRL>-C, срабатывает стандартная процедура обработки этого прерывания и вывод прекращается (как и программа в целом)
Пример.
mov AH, 2h ;Выбор функции 2
mov DL,* ;Отображаемый символ
int 21h ;Вызов DOS для исполнения
Прямой вывод (06h)
Функция может читать из стандартного входного устройства или выводить на стандартное устройство, при этом исключает стандартная реакция системы на ввод <CTRL>-C. В случае вывода код ASCII передаваемого символа засылается в регистр DL, при вводе DL=FFh.
Пример.
mov AH, 6h ;Выбор функции 6
mov DL,* ;Отображаемый символ
int 21h ;Вызов DOS для исполнения
Вывод строки (09h)
Функция передает строку символов на стандартное устройство вывода. В регистр DX помещается смещение строки. Строка должна оканчиваться символом доллара ($). Управляющие символы (табуляция, возврат каретки) распознаются системой DOS. Если в процессе вывода сообщения на экран с клавиатуры поступает код <CTRL>-C, срабатывает стандартная процедура обработки этого прерывания и вывод прекращается (как и программа в целом)
Пример.
mov AH, 9h ;Выбор функции 9
mov DX,offset string ;Адрес строки
int 21h ;Вызов DOS
.DATA
string DB Строка 1,0dh,0Ah,$
Рассмотрим некоторые функции DOS, которые используются для ввода символьной информации с клавиатуры. Далее указывается номер функции и описание функции с примером использования.
Фильтрующий ввод с дублированием на экране (01h)
Функция ожидает, пока символ будет считан с устройства ввода, посылает символ на стандартный выход (дисплей) и сохраняет его в регистре AL. Если символ уже находится в буфере клавиатуры, то оно сразу пересылается в регистр AL. Пользователь может прекратить ввод нажатием комбинации клавиш CTRL+Break.
Пример.
mov AH, 1h ;Выбор функции 1
int 21h ;Вызов DOS
mov char, AL ;Сохранение символа
Прямой ввод без ожидания (06h)
Функция не ожидает поступления очередного символа, а сама обращается в стандартному входному буферу за следующим символом. Комбинация клавиш CTRL+Break неактивна. Перед вызовом прерывания в регистр DL необходимо поместить значение 0FFh. Если обнаружен символ во входном буфере, то он перемещается в регистр AL и флаг ZF сбрасывается. Если символ не обнаружен, то ZF=1.
Пример.
mov AH, 6h ;Выбор функции 6
mov DL, 0FFh
int 21h ;Вызов DOS
Прямой ввод с неактивной CTRL+Break (07h)
Функция ожидает нефильтрованный символ со стандартного входа без эхо-символа. Комбинация клавиш CTRL+Break неактивна. Регистр AL содержит вводимый символ.
Пример.
mov AH, 7h ;Выбор функции 7
int 21h ;Вызов DOS
Прямой ввод с активной CTRL+Break (08h)
Функция ожидает нефильтрованный символ со стандартного входа без эхо-символа. Комбинация клавиш CTRL+Break активна. Регистр AL содержит вводимый символ.
Буферизованный ввод (0Аh)
Функция 0Аh считывает строку символов размером до 255 символов со стандартного входа и сохраняет ее в буфере. Клавиша <BackSpace> может использоваться для стирания символов и возврата курсора. Пользователь может прервать ввод нажатием клавиши <Enter>. Все вводимые символы отображаются на экране. Не пропускаются нажатие клавиш, которые не создают символы ASCII. Байт со смещением 0 содержит максимальное число символов, которое можно ввести, включая клавишу <Enter>. В байте со смещением 1 сохраняется количество введенных символов. Сами символы будут размещены в буфере со смещением 2.
Пример.
.DATA
keyboard LABEL BYTE
maxkeys DB 32
charsinput DB ?
buffer DB 32 dup (0)
.CODE
…
mov DX,offset keyboard
mov AH, 0Ah ;Выбор ввода с консоли
int 21h ;Вызов DOS
Получение статуса ввода (0Вh)
Функция 0Вh проверяет стандартный буфер ввода на наличие в нем символов. Если есть символ, то регистр AL=0FFh, в противном случае AL=0.
Пример.
mov AH, 0Вh ;Проверка статуса ввода
int 21h ;Вызов DOS
Чтение из файла или входного устройства (3Fh)
Функция может использоваться для чтения строки символов из файла или входного устройства. Регистр DX содержит смещение входного буфера, размер которого больше или равен значению величины, помещенной в регистр СХ. Регистр ВХ определяет стандартное входное устройство или индекс файла. Для стандартной клавиатуры значение регистра ВХ=0. В регистре СХ находится значение максимального количества байтов для чтения. В регистре АХ возвращается число реально считанных символов. Функция может считывать символы и прекращает работу при нажатии клавиши <Enter>.
Пример.
.DATA
buffer DB 127 dup (0)
.CODE
…
mov AH, 3Fh ;Чтение из файла/консоли
mov BX,0
mov CX,127
mov DX,offset buffer
int 21h ;Вызов DOS
Клавиши, не имеющие соответствующего кода ASCII, называются управляющими клавишами. В их число входят клавиши перемещения курсора, клавиши <PgUp>, <PgDown>, <Home>, <End> и другие. При нажатии управляющей клавиши первым символом, помещаемым во входной буфер, будет 00h. Чтобы получить скан-код нажатой клавиши, необходимо получить из буфера еще один символ.
Пример 1.
mov AH, 07h ;Функция ввода с консоли
int 21h ;Вызов DOS, AL=0
int 21h ;AL содержит скан-код
mov scan, AL
Пример 2. Ожидание ввода пробела
loop1: mov ah,7 ; нефильтр. ввод без эха
int 21h
cmp al,' ' ; Пробел ?
jnz loop1 ; Нет !
Рассмотрим функции DOS для работы с датами и временем.
Получение даты (2Аh)
Функция возвращает текущую системную дату, помещая год в регистр СХ, а номер месяца в регистр DH. Номер дня помещается в регистр DL, а день недели в регистр AL. Для дней недели используются числовые обозначения: 0 воскресенье, 1 понедельник и т.д.
Пример.
mov AH, 2Аh
int 21h
mov year, CX
mov month, DH
mov day, DL
mov dayofweek, AL
Установка даты (2Вh)
Функция устанавливает текущую системную дату, используя те же регистры, что и для функции 2Ah. Функция возвращает значение 0 в регистр AL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены.
Пример.
mov AH, 2Вh
mov CX, year
mov DH, month
mov DL, day
mov AL, dayofweek
int 21h
cmp AL, 0
jne baddate
Получение времени (2Сh)
Функция возвращает текущее системное время, помещая часы в регистр CH, минуты в регистр CL, секунды в DH и сотые доли секунд в DL.
Пример.
mov AH, 2Сh
int 21h
mov hours, CH
mov minutes, CL
mov seconds, DH
Установка времени (2Dh)
Функция устанавливает текущее системное время, используя те же регистры, что и для функции 2Сh. Функция возвращает значение 0 в регистр AL, если изменение прошло успешно, или значение 0FFh, если данные не были изменены.
Пример.
mov AH, 2Dh
mov CH, hours
mov CL, minutes
mov DH, seconds
int 21h
cmp AL, 0
jne badtime
Арифметические команды могут обрабатывать четыре типа чисел беззнаковые двоичные, знаковые двоичные, беззнаковые упакованные десятичные и беззнаковые неупакованные десятичные. Двоичные числа могут быть 8- и 16-разрядными. Десятичные упакованные числа содержат в байте две цифры, неупакованные одну.
Упакованные десятичные числа содержат в каждом байте две десятичных (0 9) цифры. В старшем полубайте содержится старшая значащая цифра, в младшем младшая. Каждая десятичная цифра представляется в двоичном (или, что то же самое, в шестнадцатеричном) коде. Диапазон представления упакованных десятичных чисел в байте 0 99. Сложение и вычитание упакованных десятичных чисел осуществляется в два этапа.
Сначала байты складываются или вычитаются как беззнаковые двоичные числа, а затем соответствующая команда коррекции приводит результат к виду правильного упакованного десятичного числа. Команды коррекции для умножения и деления упакованных десятичных чисел отсутствуют.
Неупакованные десятичные числа содержат в байте одну десятичную цифру в младших четырех разрядах. Старшие четыре разряда должны быть нулями. Ниже приведена арифметическая интерпретация 8-разрядных двоичных чисел.
Таблица 10
Шестнадца-теричный код |
Двоичный код |
Беззнаковое двоичное |
Знаковое двоичное |
Неупакован-ное десятичное |
Упакован-ное десятичное |
07 |
00000111 |
7 |
+7 |
7 |
7 |
89 |
10001001 |
137 |
-119 |
недействит. |
89 |
С5 |
11000101 |
197 |
-59 |
недействит. |
недействит. |
Неупакованное десятичное число легко может быть преобразовано в ASCII-представление соответствующей цифры. Для этого в старший байт неупакованного десятичного числа следует поместить значение 3.
Рассмотрим команды для работы с этими форматами чисел.
ААА
Команда ААА (коррекция сложения неупакованных десятичных чисел) приводит содержимое регистра AL к виду правильного неупакованного десятичного числа, старший полубайт при этом обнуляется. Команда ААА изменяет значение флагов FC и AC; содержимое флагов OF, PF, SF и ZF после выполнения команды ААА неопределено.
Пример.
mov AX, 0605h ;неупакованное десятичное 65
add AL, 09h ;AХ=060Eh
aaa ;AX=0704h
DAA
Команда DAA (десятичная коррекция сложения) приводит содержимое регистра AL к виду правильного упакованного десятичного числа после предшествующей команды сложения. Команда DAA изменяет значение флагов AF, CF, PF, SF и ZF; содержимое флага OF после выполнения команды DAA не определено.
Пример.
mov AL, 87h ;упакованное десятичное 87
add AL, 04h ;AL=88h
daa ;AX=91h
AAS
Команда AAS (коррекция вычитания неупакованных десятичных чисел) корректирует результат предшествующего вычитания двух правильных неупакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда AAS приводит значение в AL к виду правильного неупакованного десятичного числа; старший полубайт при этом обнуляется. AAS воздействует на флаги AF и CF; Значение флагов OF, PF, SF и ZF после выполнения команды AAS не определено.
DAS
Команда DAS (десятичная коррекция вычитания) корректирует результат предшествующего вычитания двух правильных неупакованных десятичных чисел. Операндом назначения в команде вычитания должен быть регистр AL. Команда DAS приводит значение в AL к виду двух правильных упакованных десятичных чисел. Команда DAS воздействует на флаги AF и CF. Значение флагов OF, PF, SF и ZF после выполнения команды DAS не определено.
ААМ
Команда ААМ (коррекция умножения неупакованных десятичных чисел) приводит результат предшествующего умножения к двум правильным неупакованным десятичным цифрам. Для получения правильного результата после выполнения коррекции старшие полубайты умножаемых операндов должны быть нулевыми, а младшие должны быть правильными двоично-десятичными цифрами.
Команда ААМ воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААМ неопределено.
AAD
Команда AAD (коррекция деления неупакованных десятичных чисел) модифицирует содержимое регистра AL перед выполнение деления так, чтобы при выполнении деления в частном получилось правильное неупакованное десятичное число. Для получения правильного результата после выполнения деления содержимое регистра AH должно быть нулевым. Команда ААD воздействует на флаги PF, SF и ZF. Содержимое флагов AF, CF и OF после выполнения команды ААD неопределено.
Пример 1. Вывод неупакованного десятичного числа на экран
mov AX, 0605h ;неупакованное десятичное 65
add AL, 09h ;AХ=060Eh
aaa ;AX=0704h
or AX, 3030h
mov DL,AH ;Отображаемый символ
push AX
mov AH, 6h ;Выбор функции 6
int 21h ;Вызов DOS для исполнения
pop AX
mov DL,AL ;Отображаемый символ
mov AH, 6h ;Выбор функции 6
int 21h ;Вызов DOS для исполнения
Пример 2. Вывод упакованного десятичного числа на экран
mov AL, 65h ;упакованное десятичное 65
add AL, 09h ;
daa ;AL=74h
push AX
sar AL, 4
or AL,30h
mov DL,AL ;Отображаемый символ
mov AH, 6h ;Выбор функции 6
int 21h ;Вызов DOS для исполнения
pop AX
and AL,04h
or AL, 30h
mov DL,AL ;Отображаемый символ
mov AH, 6h ;Выбор функции 6
int 21h ;Вызов DOS для исполнения
…
mov AX,3
int 21h
mov BX,AX
…
ti
…
…
…
iret
Вызывающая программа
Память
Обработчик
прерывания
А также другие работы, которые могут Вас заинтересовать | |||
19642. | Комплексные методы маркетинговых исследований. Отчет о выполненных маркетинговых исследованиях | 81 KB | |
Занятие 14. Комплексные методы маркетинговых исследований. Отчет о выполненных маркетинговых исследованиях. Комплексные смешанные методы которые сочетают возможности качественных и количественных исследований за счет проектирования процессов измерения. К так | |||
19643. | Период первобытности | 13.21 KB | |
Период первобытности в наиболее развитых регионах земли закончился на рубеже 34 тысячелетиий до нашей эры .На смену ему приходит период который называется цивилизация. Строительство городов является одним из первых признаков рождения цивилизации. Окончательно циви | |||
19644. | Характеристика цивилизации Древнего Востока | 10.39 KB | |
Характеристика цивилизации Древнего Востока На рубеже 43 тысячелетия заканчивается период первобытности и мир переходит в эпоху цивилизации. Признаки цивилизации: Государство появление городов письменность ирригация искусственные каналы для орошения полей со... | |||
19645. | Характеристика античной цивилизации | 11.41 KB | |
Характеристика античной цивилизации. Море это главное богатство греков оно давало возможность заниматься ремеслом торговлей мореплаванием. Занимались скотоводством выращиванием оливок и винограда. ВЕЛИКАЯ ГРЕЧЕСКАЯ ЦИВИЛИЗАЦИЯ Причины колонизации: 1. быстры... | |||
19646. | Становление Древнерусского государства. Норманская теория | 11.2 KB | |
Становление Древнерусского государства. Норманская теория В IX веке у восточных славян возникает госво. Согласно норманнской теории сформулированной немецкими учеными Г. Ф. Миллером и Г.З. Байером в XVIII веке создание русского госва приписывалось скандинавским викинга | |||
19647. | Первые Киевские князья | 14.56 KB | |
Первые Киевские князья В 879 г. Рюрика на новгородском престоле сменил Олег Вещий.В 882г. Олег совершил поход на Киев и убил правящих там князей Дира и Аскольда а затем провозгласил себя правителем единого киевсконовгородского государства. Позднее в XIX веке оно получит н | |||
19648. | Причины феодальной раздробленности на Руси | 14.66 KB | |
Причины феодальной раздробленности на Руси: Господство натурального хозяйства и как следствие слабые экономические связи между районами государства. Усиление отдельных княжеств правители которых уже не желают подчиняться киевскому князю. Постоянные усобиц... | |||
19649. | Значение Батыева нашествия и установления монгольского ига | 15.09 KB | |
31 мая 1223 г. на реке Калке монголы разгромили лишенное единства русское войско. Это поражение имело большое моральное значение для будущего завоевания Руси возник миф о непобедимости монголов. В 1237 г. началось нашествие монголов на Русь. Были разорены Рязань Москва Сузд... | |||
19650. | Причины образования единого Российского государства | 16.25 KB | |
В XIII-XIV веках сложились предпосылки образования русского централизованного государства экономические и политические. Причины образования единого Российского государства: Потребность в сплочении сил Руси для освобождения от ордынского ига Необходимость по | |||