Lectures / 16-17
.pdfПрограммно-управляемый ввод/вывод |
|||
Передача команды чтения |
CPU → |
I\O |
|
|
модулю ввода/вывода |
||
|
|
|
|
Прочитать биты состояния |
I\O → |
CPU |
|
|
из порта состояния УВВ |
||
|
|
|
|
Нет |
УВВ |
|
|
|
готово к передаче? |
|
|
|
Да |
|
|
|
Прочитать данные из |
I\O → |
CPU |
|
регистра данных УВВ |
|
|
Нет |
Приняты |
|
|
|
|
|
|
|
все данные? |
|
|
|
Да |
|
|
Пример: порт состояния принтера
(LPT1)
Пример: порт управления принтера
(LPT1)
(Command Register)
Пример: вывод символа на принтер
; Ожидание готовности
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
dx, 379h |
;dx <-- № порта состояния |
|
m1: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in |
al, dx |
;al <-- содержимое порта состояния |
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
test |
al, 10000000b |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
jz |
m1 |
;цикл, пока бит 7 =0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
; Запись данных в регистр данных |
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
dx, 378h |
;dx <-- № порта данных |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
al, char |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out |
dx, al |
;записать символ в порт данных |
|
; Команда “записать” |
|
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mov |
dx, 37Ah |
;dx <-- № порта управления |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in |
al, dx |
;al <-- содержимое порта управления |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
or |
al, 1 |
;младший бит в “1” |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out |
dx, al |
;строб = 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
and |
al, 0FEh |
;младший бит в “0” |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out |
dx, al |
;строб = 0 |
Ввод/вывод, управляемый прерываниями
|
|
|
|
|
|
|
|
CPU → I\O |
|||||||
Передача команды |
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выполнение |
|
чтения модулю |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
других действий |
|
ввода/вывода |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Прочитать данные из |
|
|
|
|
|
|
|
|
|
|
|
|
|
Прерывание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
регистра данных УВВ |
|
|
|
|
|
|
|
I\O → CPU |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Нет |
Приняты |
|
|
|
все данные? |
|
Да
Выполнение программы и обработчика
прерываний (ISR - Interrupt Service Routine)
Программа |
Обработчик |
|
прерывания (ISR) |
|
2
INTR
3
1
4
iret
ISR (Interrupt
Service Routine)
Виды прерываний
• Программные прерывания
осуществляются командой
int <номер_прерывания>
• Исключения
генерируются внутри процессора в ответ на исключительные ситуации (деление на ноль, недопустимый КОП и т.п.)
• Аппаратные прерывания
вызываются внешними по отношению к процессору событиями, связанными с аппаратурой
Виды прерываний
|
|
|
|
|
Вид |
|
Программное |
Исключение |
Аппаратное |
прерывания: |
|
прерывание |
|
прерывание |
|
|
|
|
|
|
|
|
|
|
Источник |
|
Команда int |
Ошибка в |
Событие, |
прерывания |
|
|
программе |
связанное с |
|
|
|
аппаратурой |
|
|
|
|
|
|
|
|
|
|
|
Тип |
|
Внутренний |
Внутренний |
Внешний |
источника |
|
|||
прерывания |
|
|
|
|
|
|
|
|
|
Событие по |
|
|
|
|
отношение к |
|
Синхронное |
Синхронное |
Асинхронное |
текущей |
|
|
|
|
команде |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Таблица векторов прерываний
Адрес |
Память |
|
|
|
|
0 |
|
IP ISR0 |
|
|
|
2 |
|
CS ISR0 |
|
|
|
4 |
|
IP ISR1 |
|
|
|
6 |
|
CS ISR1 |
|
|
|
|
|
... |
|
|
|
4*i |
|
IP ISRi |
|
|
|
4*i+2 |
|
CS ISRi |
|
|
|
|
|
... |
|
|
|
4*255 |
|
IP ISR255 |
|
|
|
4*255+2 |
|
CS ISR255 |
|
|
|
Адрес |
Обработчик |
|
прерывания 0 |
|
|
ISR0 |
|
|
|
|
|
Адрес |
|
|
Обработчик |
|
|
ISR1 |
|
|
|
прерывания 1 |
|
|
|
|
Адрес |
. |
|
. |
|
|
ISRi |
|
|
. |
|
|
|
|
|
|
|
|
Адрес |
Обработчик |
|
прерывания i |
|
|
ISR255 |
|
|
|
|
|
|
|
|
|
... |
|
Входы процессора для аппаратных
прерываний
NMI
if
INTR Процессор
NMI - внешние немаскируемые прерывания (для аварийных ситуаций)
INTR - внешние маскируемые прерывания