- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Обработчик прерываний от таймера
В резидентной программе русификации принтера необходимо постоянно быть уверенным в том, что в принтер загружен новый шрифт. Поскольку новый шрифт загружается в оперативную память принтера используя часть буфера печати, то при выключении принтера содержимое этой памяти теряется. После выключения принтера шрифт необходимо вновь загрузить в принтер, т.о. TSR программы должно постоянно проверять включен принтер или нет и если принтер выключен, то устанавливать свой внутренний флажок – шрифт не загружен. Следовательно, когда возникает необходимость печати, TSR программа снова загрузит шрифт.
Подобным образом, большому кол-ву TSR программ необходимы постоянные по времени проверки ресурсов системы или активизации некоторых процессов.
Осуществить подобные действия м. с помощью обработчика прерываний от таймера.
Для того, чтобы прикладные программы могли использовать сигналы таймера, не нарушая при этом работу системных часов, в программе BIOS, обслуживающую аппаратные пред-я от таймера, поступающие через вектор 08, включен вызов int 1ch, передающий управление на программу-заглушку BIOS, которая содержит единственную команду iret.
Пример обработки прерывания от таймера из TSR прогр. prn-res.
Контроллер прерываний и его программирование
Если необходимо написать обработчик аппаратного прерывания – то нужно выполнить все необходимые действия:
во-первых: аппаратура, от которой пришло прерывание;
во-вторых: микросхемы контроллера прерываний.
Рассмотрим особенности функционирования и программирования контроллера прерываний. Сигналы прерываний поступают от ВУ через контроллер прерываний – микросхема Intel 8259A.
Организация аппаратных прерываний в IBM РС/ХТ
Баз. вектор – 8 IRQ - Interrupt Request
Порты 20h, 21h Запрос прерывания
Основное назначение контроллера – направление сигналов запросов прерываний от восьми устройств на единств.вход прерываний процессора, кроме этого контроллер передает в процессор номер вектора по линиям данных. Сигнал INT поступающий на одноименный вход СРИ инициирует процедуру прерывания. Номер вектора образуется из базового вектора следующим образом:
о |
о |
о |
о |
1 |
|
о |
о |
о |
номер IRQ IRQ0 08h Таймер
т.о. 08h – это вектор IRQ0 1 09h Клавиатура
9h -«- IRQ1 2 OAh Резерв
… 3 Obh Сом2
Fh – это вектор IRQ7 4 Och Сом1
5 ODh Жесткий диск
6 OEh Гибкий диск
7 Ofh LPT1
Компьютеры IBM PC/AT комплектуются большим количеством устройств. Для обслуживания большего количества устройств контроллеры можно объединять, создавая веерообразную структуру (max к каждому входу. ведущего контроллера можно подключить свой ведомый контроллер и получить систему с 64 входами запросов прерываний).
В АТ устанавливается 2 контроллера.
Баз.вектор – 70h Базовый вектор - 8
Порты А0h, А1h Порты 20h, 21h
Т.о. возможное число устройств до 15 (7 у ведущего и 8 у ведомого контроллера).
Выход INT ведомого контроллера подключается к входу IRQ2 ведущего,
а выход ведущего к CPU.
Базовый вектор у ведомого 70h:
7 0
0 |
1 |
1 |
1 |
|
|
|
|
|
Номер IRQ
Соответствие векторов прерываний устройствам компьютера
Уровень |
Вектор |
Устройство |
IRQ IRQ1 IRQ2 IRQ8 IRQ9
IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15
IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 |
8h 9h Ah 70h 71h
72h 73h 74h 75h 76h 77h
Bh Ch Dh Eh Fh |
Таймер Клавиатура Вход от ведомого Клапан микросхемы часы realtime Программно перенапр. на IRQ2 (int Oah)
Резерв -«- Мышь (PS/2) Сопроцессор Жесткий диск Резерв
Сом 2 Сом 1 Принтер LPT2 Гибкий диск LPT1 |
Рассмотрим внутреннюю структуру контроллера. В нем можно выделить четыре основные узла: (все 8 бит)
регистр входных запросов
регистр маски
схема приоритетов
регистр обслуживаемых запросов
-
CPU
IF
Проц.
прер.
INTA
IRQ 1 2 3 4 5 6 7 |
0 1-0 0 0 0 0 0 0 |
|
0 0 1 0 1 0 0 0 |
|
Х
Х Х Х Х Х Х |
|
0 1-0 0 0 0 0 0 0 |
EOI |
Регистр Регистр Схема Регистр
запросов маски анализа обслуживаемых
IRR IMR приоритетов запросов
Порт 20h Порт 21h Порт 20h ISR, порт 20h
Сигнал запроса прерывания IRQ от устройства поступает на вход регистра запросов, например, от клавиатуры сигнал поступает на IRQ1 и устанавливается в 11-ый бит этого регистра. Далее на пути сигнала стоит регистр маски. Значение в бите маски разрешает прохождение сигнала. Значение 1 – запрещает. Пройдя через маску, сигнал поступает на схему анализа приоритетов. Пройдя схему анализа приоритетов, сигнал запроса прерывания поступает на вход регистра обслуживаемых запросов и дает разрешение на установку в 1 его бита, однако не устанавливает его. Одновременно сигнал поступает на вход INT МП. МП регистрирует поступление INT, если установлен флаг IF разрешения прерывания в регистре флагов. Получив INT, МП отвечает сигналом INTA – Interrupt Acknolege - подтверждение прерывания, который поступает в контроллер и выполняет 2 действия:
Устанавливает бит регистра обслуживаемых запросов.
Сбрасывает бит регистра запросов.
Т.о. запрос начал обслуживаться МП и, начиная с этого момента, на
вход контроллера прерывания может придти следующий сигнал прерывания от устройства.
МП одновременно с посылкой сигнала INTA сбрасывает флаг IF, запрещая
все аппаратные прерывания. Прерывания останутся запрещенными до выполнения пользователем команды sti.
Установка 1 в бите регистра обслуживаемых запросов воздействует на схему анализа приоритетов. Установленный бит блокирует в схему анализа приоритетов все уровни прерываний, начиная с текущего и ниже. Т.о., чтобы разблокировать все прерывания данного и более низких приоритетов необходимо сбросить бит регистра обслуживаемых запросов засылкой кода 20h в порт 20h для ведущего контроллера и в порт Aoh ведомого. Этот код получил название команды EOI - End Of Interrupt – конец прерывания. Приказ конца прерывания должен возбуждаться в любом обработчике прерываний.
Т.о. в программе обработки аппаратного прерывания можно выделить три участка:
(cli)
IRQ1 |
|
Запрещены все вложенные прерывания, независимо от их приоритетов (IRQ - IRQ7) |
|
sti |
|
|
|
Разрешены только вложенные прерывания с более высокими приоритетами IRQ |
|
EOI |
|
|
iret |
Разрешены все вложенные прерывания, независимо от их приоритетов (IRQ0 - IRQ7) |
Поскольку, получив сигнал INT и ответив сигналом INTA, CPU сбрасывает флаг IF, все прерывания оказываются запрещенными, и программа не может быть прервана внешними сигналами. Команда sti – устанавливает IF и разрешает прохождение запросов прерываний в процессор, причем все уровни с текущего оказываются заблокированными, т.е. работа обработки может быть прервана только при поступлении запроса более высокого приоритета (IRQ). Приказ EOI – снимает блокировку в контроллере и, начиная с этого момента, запрос прерывания любого уровня прервет выполнение обработки. Если обработчик прерывания IRQ1 прерывается этим же запросом – это приводит к тому, что программа обработка, не дойдя до конца, опять начинаться сначала и происходит повторный вход в программу. Т.о. обработчик должен быть реентабельным.
Структура обработки выбирается исходя из конкретных условий. Часто sti - ставят в самом начале, чтобы не задерживать обработку прерывания от более приоритетных устройств (в частности таймера). Приказ EОI посылается в контроллер в самом конце программы перед iret. Т.о. исключаются вложенные прерывания.
-
IRQ
MOV AL, 20h
ОUT 20h, AL
IRET
Команда EOI
Однако, сигнал прерывания от того же уровня может придти между командой Out 20h, AL и iret. Поскольку блокировка нижележащих уровней уже снята, возникнет вложенное прерывание и повторный вход в ту же программу. Чтобы избежать этого перед самым приказом EOI выполни cli
-
IRQ
Sti
cli
MOV AL, 20h
ОUT 20h, AL
IRET
EOI
В результате вложенные прерывания запрещаются до выхода из обработчика. Однако, прерывания не останутся запрещенными навсегда – команда iret вернет
из стека
(к = 0 не м.б., так и этого прерывания не произошло). Отсюда следует, что в обработчике вообще может отсутствовать sti. В этом случае обработчик будет выполняться при запрещенных прерываниях и разрешены прерывания будут только после выполнения команды iret.
Запросы на прерывания, поступающие в ведущий контроллер IRQ - IRQ7 – блокируют только ведущий контроллер. Однако запросы на прерывание, поступающие в ведомый контроллер, приоритет (IRQ8-IRQ15) , блокируют уровни низших приоритетов в ведомом и IRQ2 - IRQ7 – в ведущем контроллере. Поэтому
в обработанных прер.уровней 8…15 следует предусматривать посылку команды
конца прерываний в оба контроллера:
mov AL, 20h
out 20h, AL
out A0h, AL
Рассмотрим несколько примеров программирования контроллера прерывания.
Существует возможность запретить не все, а лишь избранные аппаратные прерывания записью 1 в соответствующий разряд регистра маски прерываний (IMR) контроллера. Для разрешения прерываний нужно записать в тот же разряд.
in AL, 21h ; прочитать текущую маску
or AL, 1 ; установить добавочно бит
out 21h, AL ; вернуть в IMR
Выполнение этих команд приведет к остановке системного таймера. Это можно проверить с помощью часов Norton Commander.
После этого необходимо выполнить:
in AL, 21h ; прочитать IMR
and AL, FEh ; сбросить бит
оut 21h, AL ; вернуть в IMR
или:
in AL, 21h ; прочитать IMR
or AL, 00000010B ; запрет прерывания от клав.
and 21h, AL
-«-
in AL, 21h
and AL, 11111101B ; разрешает прерывание
out 21h, AL
Таким же образом можно запретить прерывания от контроллера гибких дисков и т.д.
Есть одно внешнее прерывание, которое не может быть замаскировано. Это так называемое немаскируемое прерывание NMI. Оно имеет номер 02h, обладает более высоким приоритетом, чем остальные аппаратные прерывания.
Для того чтобы прочитать состояние регистра обслуживаемых запросов, необходимо в порт 20h послать команду OBh – разрешение чтения ISR. Следующий пример иллюстрирует чтение регистра запросов до EOI и после EOI.
EOI EQU 20h
mov AL, Obh ;Команда разрешения
out 20h, AL ;Чтение регистра запросов
jmp $+2 ;Задержка для быстрых vfiby
jmp $+2 ;(иногда не нужна)
in AL, 20h ;Читаем регистр ISR
; распечатка ISR
mov Al, EOI ;Команд EOI в
out 20h, Al ;ведущ.контрол.
jmp $+2
jmp $+2
in AL, 20h
; распечатка ISR
После команды OBh возможно неоднократное чтение ISR.