- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Взаимодействие прикладных и системных обработчиков прерываний
В большинстве случаев пользователю требуется лишь незначительно изменить или дополнить системный обработчик. В этих случаях используется метод сцепления прикладного обработчика с системным, когда программа пользователя выполняет свою часть обработки либо до, либо после системной. Это приемлемо как для обработки аппаратных, так и программных прерываний.
При инициализации прикладного обработчика, сцепляемого с системным, следует сохранить адрес системного обработчика (или прикладного, который уже перехватил системный). Адрес запоминается в 2-х словной ячейке old-int. В вектор заносится адрес нового обработчика new-int. Если прикладная обработка д.б. после системной, то структура прикладного обработчика следующая:
Old_int DD ?
.
.
.
new_int proc far
pushf
call cs:old_int ; в систем. обр. с возвратом
.
.
; прикладная обработка
.
iret
new_int endp
Рассмотрим структуру стека при выполнении процедуры прерывания и вызове new_int
-
Это для iret системного обработчика
IP2
От команды call cs:old_int
CS2
Флаги
От pushf
Это для iret прикладного обработчика
IP1
отновит. Адрес точки возврата в прерванный процесс
CS1
сегментный адрес прерванного процесса
Флаги
Т.о. в результате команд pushf и call в стеке формируется трехсловная структура, необходимая команде iret – системного обработчика, чтобы вернуться в new_int. Команда call CS:old_int – формирует дальний вызов процедуры точно также как call dword PTR CS:[old_int] за счет того, что old_int объявлено двойным словом.
Если прикладная обработка должна вестить до системной, то структура обработчика должна иметь вид:
new_int proc far
…
; прикладная обработка
jmp CS:old_int ;В системный обработчик без возврата
new_int endp
Команда jmp передает управление в системный обработчик (не затрагивая стек), который далее работает обычным образом.
Иногда прикладной обработчик должен выполнить некоторые действия до передачи упр. в системный, а некоторые после. В этом случае структура обработчика следующая:
new_int proc far
…
; прикладная обработка до системной
pushf
call cs:old_int ; в системный обработчик с возвратом
…
; прикладная обработка после системной
iret
new_int endp
В некоторых случаях обработчик, получив управление, анализирует ситуацию и либо выполняет обработку сам, полностью исключив системный обработчик, либо отдает управление системному:
new_int proc far
; анализ ситуации
jmp cs:old_int ; в системный обработчик с возвратом
…
; прикладная обработка, системная исключается
iret
new_int endp