- •Лекции 19-20
- •Понятие прерывания
- •Аппаратное прерывание
- •Аппаратное прерывание
- •Аппаратные прерывания
- •Номера IRQ аппаратных
- •Исключения
- •Программное прерывание
- •Программное окружение прерываний
- •Таблица прерываний
- •Прерывание 10h (Видео
- •Прерывание 16h (клавиатура)
- •Прерывание 21h (сервис DOS)
- •Функции консольного вывода
- •Функции консольного ввода
- •Функции файлового ввода -
- •Функции файлового ввода - вывода
- •Функции работы с памятью
- •Пример
- •Пример
- •Пример
- •;------ Cycle for read & write -----------
- •next4:
- •Перехват прерываний
- •Перехват прерываний
- •Перехват прерываний
- •Перехват прерываний
- •Перехват прерываний
- •Создание собственных обработчиков прерываний
- •Создание собственных обработчиков прерываний
- •Создание собственных обработчиков прерываний
- •Пример 1
- •Обработчик (начало инсталятора)
- •Обработчик (вывод сообщения о наличии
- •Обработчик (инсталляция)
- •Пример использования
- •Пример 2
- •Обработчик (код обработки - продолжение)
- •Обработчик (начало инсталятора)
- •Обработчик (вывод сообщения о наличии
- •Обработчик (инсталляция)
- •Пример 3
- •Обработчик (начало инсталятора)
- •Обработчик (вывод сообщения о наличии
- •Обработчик (инсталляция)
Пример
Stk SEGMENT use16 STACK ASSUME ss: Stk
db 256 dup(0) Stk ENDS
Code SEGMENT use16 ASSUME cs: Code
start:
mov |
ax, data |
;В AX адрес сегмента данных |
mov |
ds, ax |
;DS устанавливаем на AX |
|
|
|
; |
------ Input & open src file name |
------- |
|
|
mov |
ah, 09h |
;Вывод приглашения ввода имени исходного файла |
|
mov |
dx, offset mess1 |
|
|
int |
21h |
|
|
mov |
ah, 0ah |
;Ввод имени файла |
|
mov |
dx, offset file1 |
|
|
mov |
si, dx |
|
|
inc |
si |
|
|
int |
21h |
|
|
xor |
ax, ax |
;Запись вместо 0dh значения 0 |
|
mov |
al, ds:[si] |
|
|
add |
si, ax |
|
|
mov |
byte ptr ds:[si+1], 0 |
|
|
mov |
ah, 3dh |
;Открытие файла для чтения |
|
add |
dx, 2 |
|
|
xor |
al, al |
|
|
int |
21h |
|
|
jnc |
next0 |
|
|
mov |
ah, 09h |
;Если файл открыть не удалось |
|
mov |
dx, offset mess3 |
|
|
int |
21h |
|
|
jmp |
exit0 |
|
next0: |
|
;Успешное открытие файла |
|
|
mov |
word ptr hand1, ax |
|
|
|
|
|
; |
------ Input & open dst file name |
------- |
|
|
mov |
ah, 09h |
;Вывод приглашения ввода имени целевого файла |
|
mov |
dx, offset mess2 |
|
|
int |
21h |
|
|
mov |
ah, 0ah |
;Ввод имени файла |
|
mov |
dx, offset file2 |
|
|
mov |
si, dx |
|
|
inc |
si |
|
|
int |
21h |
|
|
xor |
ax, ax |
;Запись вместо 0dh значения 0 |
|
mov |
al, ds:[si] |
|
|
add |
si, ax |
|
|
mov |
byte ptr ds:[si+1], 0 |
|
|
mov |
ah, 3ch |
;Создание файла |
|
add |
dx, 2 |
|
|
xor |
cx, cx |
|
|
int |
21h |
|
|
jnc |
next1 |
|
|
mov |
ah, 09h |
;Если файл создать не удалось |
|
mov |
dx, offset mess4 |
|
|
int |
21h |
|
|
jmp |
exit0 |
|
next1: |
|
|
|
|
mov |
word ptr hand2, ax |
;Успешное создание файла |
|
|
|
|
;------ Cycle for read & write ----------- |
|
||
loop0: |
mov |
ah, 3fh |
;Чтение из исходного файла |
|
mov |
bx, hand1 |
|
|
mov |
dx, offset buff |
|
|
mov |
cx, 512 |
|
|
int |
21h |
|
|
jnc |
next2 |
|
|
mov |
ah, 09h |
;Вывод сообщения, если ошибка |
|
mov |
dx, offset mess5 |
|
|
int |
21h |
|
|
jmp |
next4 |
|
next2: |
mov |
cx, ax |
;Запись в целевой файл |
|
mov |
ah, 40h |
|
|
mov |
bx, hand2 |
|
|
mov |
dx, offset buff |
|
|
int |
21h |
|
|
jnc |
next3 |
|
|
mov |
ah, 09h |
;Вывод сообщения, если ошибка |
|
mov |
dx, offset mess6 |
|
|
int |
21h |
|
|
jmp |
next4 |
|
next3: |
cmp |
ax, 512 |
;Проверка на конец файла |
|
jnz |
next4 |
|
|
jmp |
loop0 |
;Переход к следующей итерации |
next4: |
;Закрытие файлов |
mov |
ah, 3eh |
mov |
bx, hand1 |
int |
21h |
mov |
ah, 3eh |
mov |
bx, hand2 |
int |
21h |
exit0: |
;Завершение программы |
mov |
ax, 4c00h |
int |
21h |
Code ENDS |
|
end start |
|
|
|
Перехват прерываний
Перехват прерываний – замещение стандартного обработчика прерываний, своим собственным.
Установка своего вектора прерываний:
1.Запретить аппаратные прерывания.
2.Прочитать из таблицы векторов и сохранить старый вектор прерываний.
3.Записать в таблицу векторов адрес своего обработчика.
4.Разрешить аппаратные прерывания.
Возврат старого вектора прерываний:
1.Запретить аппаратные прерывания.
2.Записать в таблицу векторов адрес своего обработчика.
3.Разрешить аппаратные прерывания.
Перехват прерываний
Схемы обработки прерываний:
Монопольная обработка прерывания.
Обработка прерывания до выполнения стандартного обработчика.
Обработка прерывания после выполнения стандартного обработчика.
Смешанный режим обработки.
Перехват прерываний
Монопольная обработка: vector proc far
…
iret vector endp
Обработка прерывания до выполнения стандартного обработчика vector proc far
…
jmp far ptr oldvector vector endp
Обработка прерывания после выполнения стандартного обработчика. vector proc far
pushf
call far ptr oldvector
…
iret vector endp
Перехват прерываний
Смешанный режим (вариант 1) |
Смешанный режим (вариант 2) |
||
vector proc far |
|
vector proc far |
|
… |
|
… |
|
pushf |
|
Jcc |
label |
call |
far ptr oldvector |
pushf |
|
… |
|
call |
far ptr oldvector |
iret |
|
label: … |
|
vector endp |
|
iret |
|
|
|
vector endp |
|
Перехват прерываний
Общие правила перехвата прерываний:
Обработчик прерывания не должен изменять входные значения регистров. Используемые в обработчике регистры необходимо сохранить в стеке на время выполнения обработчика.
При обработке аппаратных прерываний обработчик не должен затрачивать много время.