Слайд 1GNU Эмулятор, прерывания
Аппаратный таймер.
Клавиатура.
Нити исполнения.
Программные прерывания
Слайд 2Обработка прерываний
Прерывания доступны, если включен флаг (бит) регистра состояния SR
I(nterrupt) !!!
Команда CLI ; I(nterrupt) = 0
Команда STI : I(nterrupt)
= 1
Слайд 3Прерывания процессора
Вектор прерывания состоит из номера N и адреса OFF
подпрограммы обработки прерывания.
Номер вектора прерывания представляет собой ячейку оперативной
памяти, где записан адрес соответствующей подпрограммы обработки прерывания.
Следует иметь в виду, что в эмуляторе есть зарезервированные вектора прерываний для виртуальных устройств.
Это номера 02,03,04.
При реализации программных прерываний номера 03 и 04 не используют, а в прерывание 02 размещают адрес обработчика аппаратного таймера.
Слайд 4Алгоритм обработки
При выполнении команды INT N (появление сигнала прерывания) микропроцессор
выполняет следующие действия:
Выполняется обращение к номеру ячейки оперативной памяти N.
В
регистр IP загружается адрес OFF процедуры обработчика прерывания
В стек заносится адрес ADDR команды, которая идет следом за командой INT.
Начинается выполнение команд процедуры обработчика прерывания.
После достижения команды IRET из стека в IP загружается адрес команды программы ADDR и работа программы продолжается
Слайд 5Настройка аппаратного таймера
Аппаратный таймер выполняет обращение к вектору прерывания 02
с периодом, который задается с помощью вкладки «Configuration»
Для увеличения
времени периода срабатывания используется кнопка «Increase».
Для уменьшения кнопка «Reduce».
Слайд 6Вывод сообщения по тайм ауту
Упражнение №1, программа flash.asm. Пример использования
аппаратного таймера. Требуется разработать программу для вывода на устройство VDU
последовательности байтов – символов строки «ABC». Сообщение выводится постоянно в циклическом режиме вывод – стирание-вывод и т.д.
Для контроля за процессом вывода используем регистр BL.
Адрес обработчика прерывания примем равным 30.
Если в регистре код 01 – строка не выведена, 00 – строка выведена.
Следует иметь в виду, что время срабатывания системного таймера должно быть таким, что программа «успела» произвести к вектору прерывания. Иначе все время будет выполняться команд замкнутого цикла NOP !!!
Слайд 7Программа
Перейти Запуск
Байт 30 |Вектор прерывания
Запуск:
BL
вывода
Выполнять: |Замкнутый программный цикл
установить бит I(nterrupt) |Разрешить прерывания
NOP
Переход
Выполнять
Вектор прерывания таймера
Слайд 8Программа
ORG 30 |Обработчик прерывания
Сбросить флаг I(nterrupt) |Запретить прерывания
SR |Сохранить флаги
AL |Сохранить AL
В BL
бит 0 установлен ? |Строка не выведена?
Если Z=1 то Стереть |Выведена – стереть
|Вывод строки
AL < = 41
Адрес C0 <= AL
AL <= 42
Адрес C1 <= AL
AL <= 43
Адрес C2 <= AL
BL <= 0 |Cтрока выведена
Перейти Выход |Выйти
Слайд 9Программа
|Стереть строку
Стереть:
AL
[C1],AL
Адрес [C2],AL
BL
SR
Выйти из обработчика прерывания
Конец
Слайд 10Настройка тайм аута
Перед запуском программы установите режим срабатывания аппаратного таймера
равным одной секунде
Откомпилируйте программу и запустите ее в режиме автоматического
исполнения.
Используя кнопку «Faster» подберите оптимальную скорость - частоту процессора.
Слайд 11Алфавитноцифровая клавиатура
Клавиатура представляет собой устройство для работы, с которым используется
прерывание 03 и порт 07.
Клавиатура появляется на экране после
обращения к ее порту.
Слайд 12Ввод цифр и символов
Ввод символа кода выполняется путем выбора мышью
соответствующей клавиши.
При движении курсора мыши по клавише выбирается символ
в верхнем или нижнем регистре, либо выбирается комбинация клавиш.
Выбранный символ отображается рядом с клавишей SPACE (пробел) справа !!!
Слайд 13Ввод символов и цифр
Ввод символа кода выполняется путем выбора мышью
соответствующей клавиши.
При движении курсора мыши по клавише выбирается символ
в верхнем или нижнем регистре, либо выбирается комбинация клавиш.
Код, который выбран с помощью клавиатуры, помещается в регистр AL.
Ввод не буферизуется!
Слайд 14Программа ввода символов
Упражнение № 2. Программа keybrd.asm. Пример программы опроса
клавиатуры.
Коды нажатых клавиш помещаются в видеобуфер – выводятся на
VDU.
Если выбрана клавиша Enter – код 0D программа завершает работу.
В программе обязательно нужно создать пустой обработчик прерывания таймера !!!!
Иначе работа программы будет не предсказуема !!!
Слайд 15Программа
Переход Начать
Байт 20 |Обработчик таймера
Байт 30 |Обработчик клавиатуры
Начать:
BL
бит I(nterrupt) |Разрешить прерывания
Вывод => порт 07 ;Вывести клавиатуру
Выполнять:
В CL код 01 ? |Enter ?
Если Z = 0 то Выполнять |Нет !
HALT
ORG 20 |Обработчик таймера
NOP
Выход из прерывания
Пустой обработчик таймера
Слайд 16Программа
ORG 30 |Обработчик клавиатуры
Сбросить бит I(nterrupt)
SR
AL
Порт 07 => AL |Получить код
В AL код
0D |Enter ?
Если Z=1 то Выход |Да – выход
|Нет, принять код клавиши
Адрес BL <= AL
BL= BL +1 |Новый адрес в видео буфере
Перейти Финиш |Конец работы
Выход:
CL <= 01 |Флаг Enter
Финиш:
AL
SR
Установить бит I(nterrupt)
Выход их обработчика прерывания
Конец
Слайд 17Цифровая клавиатура
Для работы с устройством используется прерывание 04 и порт
08.
Как и в случае с клавиатурой ввод не буферизуется.
Упражнение
№3. Напишите программу numkbrd.asm для формирования числа с помощью цифровой клавиатуры.
Слайд 18Ввод цифр
Для формирования числа используется следующий алгоритм:
Записывается код символа введенной
цифры в регистр AL.
Код цифры преобразуется в двоичный код по
формуле AL=AL-30.
здесь 30 шестнадцатеричный код символа 0.
Код в регистре BL умножается на 10 (0A).
Новое число получается по формуле BL=BL+AL.
Если на клавиатуре нажата клавиша Enter, то в программу поступает код 0D, это приводит к выходу из обработчика прерывания, в регистр CL заносится код 01, при появлении этого кода программа завершает свою работу.
В процессе формировании числа выполняется контроль переполнения.
Слайд 19Программа
Перейти Начало
Байт 30 |Обработчик таймера
Байт 00 |Обработчик клавиатуры
Байт 40 |Обработчик цифровой клавиатуры
ORG 30 |Прерывание от таймера
SR
NOP
SR
Выход из прерывания
ORG 40 |Прерывание цифровой клавиатуры
Сбросить бит I(nterrupt)
SR
AL
Порт 08 => AL |Получить код клавиши
В AL код 0D |Enter ?
Если Z=1 то Финиш |Да,конец работы
AL=AL - 30 |Получить код
BL= BL * 0A |Новый разряд
Если бит O = 1 то Ошибка |Контроль переполнения
BL=BL+AL |Прибавить цифру
Перейти Выход |Конец работы
Слайд 20Программа
Финиш:
CL
|Переполнение
BL
Выход из прерывания
Слайд 21Программа
Начало:
BL
Запись > Порт 08 |Вывести клавиатуру
Выполнять: |Опрашивать клавиатуру
Установить бит
I(nterrupt)
NOP
В CL бит 0 установлен ? |Ввод закончен ?
Если Z = 0 то Стоп |Да выйти
Перейти Выполнять |Нет
Стоп:
Конец
Слайд 22Программный тест
Последовательное нажатие клавиш 1,2,5
Затем En(ter)
Код 125 сформирован в регистре
BL, программа завершила свою работу
Слайд 23Нити исполнения
Многопоточная обработка предусматривает организацию нитей исполнения в рамках одной
программы.
В результате возникает иллюзия много задачной обработки.
Для реализаций
нити исполнения используется аппаратный таймер, который выполняет переключение процессора с одной нити на другую.
Оформляется нить в виде подпрограммы.
Слайд 24Программные прерывания
Программные прерывания в отличие от аппаратных прерываний происходят синхронно
с работой процессора.
Они абсолютно предсказуемы.
Инициируются с помощью команды процессора
INT
N
Где N – номер вектора прерывания
Упражнение №4. Программа mesint.asm.
Напишите программу, которая использует вектор прерывания 05. Адрес обработчика прерывания равен 40. Обработчик прерывания выполняет вывод контрольного сообщения «OK!».
Слайд 25Программа
Переход Начать
байт 30 |Таймер вектор 02
байт
00 |Системный вектор 03
байт 00 |Системный вектор 04
байт 40 |Вектор программного прерывания
"OK!" |Байты сообщения
Начать:
Установить бит I(nterrupt) |Разрешить прерывания
Вызвать прерывание 05
Стоп
ORG 30 |Обработчик аппаратного таймера
NOP
Выйти из прерывания
Слайд 26Программа
ORG 40 ;Обработчик прерывания
Сбросить бит I(nterrupt) |Запретить прерывания
SR |Сохранить
флаг
BL |Регистр в стек
AL |Регистр в стек
CL |Регистр в
стек
|Вывод сообщения:
BL <= 06 |Адрес байта сообщения
AL <= C0 |Адрес видео памяти
CL <= 03 |Число байтов сообщения
Слайд 27Программа
Выполнять:
DL
BL=BL+1
CL=CL-1
Если Z=0 то Выполнять
|Восстановить регистры
CL
AL
BL
SR
Выход из обработчика
Конец
Слайд 28Контрольные задания
Контрольное задание №1. Дан алгоритм работы обработчика прерывания
для вывода показаний на цифровом дисплее. (см. далее)
Показания выводятся в
интервале от 00 до 99
Напишите программу disp1.asm которая использует программное с номером N для вывода очередного показания на цифровом дисплее.
Слайд 29Алгоритм вывода показаний
Перейти main
Вектор прерывания таймера
Программный вектор прерывания N
Коды цифр
от 0 до 9 правый дисплей
Коды цифр от 1 до
9 левый дисплей
main:
al <= Код нуля с права
Порт 02 <= al
al <= Код нуля слева
Порт 02 <= al
bl <= Адрес кода нуля с права
cl <= Адрес кода единицы слева
|Вызов программного прерывания
go:
Установить флаг I(nterrupt)
Задержка 10 итераций
Вызвать прерывание N
Перейти go
Стоп
Пустой обработчик таймера
Обработчик программного прерывания
Конец
См. далее
Слайд 30Продолжение, программный обработчик
Сбросить флаг I(nterrupt)
|Вывод цифры справа
al
02
+1
Перейти если z=1 left_nine
Перейти next
left_nine:
Сравнить bl,Адрес символа 9 справа
Перейти если z=1 yes
Перейти next
yes:
Вывести 0 слева и справа
bl = адрес 0 справа, cl = адрес 1 слева
Переход no
|Вывод новой цифры справа
См. далее
Слайд 31Продолжение
next:
bl = bl + 1
Сравнить bl,Адрес символа 9 справа +
1
Перейти если z = 1 ok
Перейти no
ok:
bl
справа
al <= Адрес bl
Порт 02 <= al
|Вывод цифры с лева
al <= Адрес cl
Порт 02 <= al
cl = cl + 1
no:
|Выход из прерывания
Выход из обработчика
См. далее
Слайд 32Контрольные задания
Контрольное задание №2. Напишите программу disp2.asm которая использует прерывание
таймера для вывода очередного показания на цифровом дисплее.
Контрольное задание №3.
Напишите программу passw.asm. В памяти ЭВМ находится кодовое слово freeway.
Пользователь программы вводит кодовое слово с помощью виртуальной клавиатуры эмулятора. После нажатия клавиши ENTER выполняется проверка ввода к кодовым словом в памяти, при удачной проверке на VDU выводится символ Y иначе символ N.
Слайд 33Контрольные задания
Контрольное задание №4. Программа twothread.asm. Две нити исполнения.
Первая
нить используется для управления работой термостата. Термостат должен постоянно поддерживать
контрольную температуру равную 20 градусов Цельсия.
Вторая нить служит для управления работой шагового двигателя. Выполнение кода нити обеспечивает вращение ротора против часовой стрелки.
В программе регистр DL используется в качестве мультиплексора.
Если регистр содержит код 00 – запускается нить термостата
Если код 01 – запускается нить двигателя.
Слайд 34Программа
Перейти Начать
DB 20 |Обработчик таймера
Начать:
Установить бит I(nterrupt)
|Разрешить прерывания
AL Порт
03
DL <= 00 |Код переключения
AL <= 11 |Запустить двигатель
AL => Порт 05
Выполнять: |Цикл программы
NOP
Установить бит I(nterrupt) |Разрешить прерывания
Перейти Выполнять
Слайд 35Программа
ORG 20 |Обработчик таймера
SR
Установлен в DL бит 0
|Нить термостата?
Если Z=1 то Пуск |Да
CALL
60 |Нить двигателя
DL <= 00 |Переключение
Перейти Выход |На выход
Пуск:
CALL 70 |Нить термостата
DL <= 01 |Переключение
Выход:
SR
Выход из прерывания
ORG 60 |Нить двигателя
Сбросить бит I(nterrupt)
SR
Слайд 36Программа
Цикл. Правый сдвиг AL |Повернуть ротор
AL => Порт 05
SR
Завершить нить
ORG
70 |Нить термостата
Сбросить бит I(nterrupt)
AL
SR
AL
Порт 03
В AL бит 0 установлен ? |Выключить нагрев?
Если Z = 0 то Выключить |Да
Перейти Нагрев |Нет
Слайд 37Программа
Выключить:
AL Порт 03
Переход Фин
Нагрев:
AL Порт 03
Фин:
|Завершить обработчик
SR
AL
Завершить нить
Конец
Слайд 38Нити исполнения (Потоки)
Чтобы в эмуляторе наблюдать несколько устройств в работе,
нужно снять отметку флажка «Show only one peripheral at a
time» на вкладке «Configuration».
После запуска программы окна устройств могут быть наложены друга на друга.
Их нужно «растащить» с помощью мыши, используя заголовок окон. Рабочая кнопка левая.
Слайд 39Нити исполнения
После запуска программы можно поэкспериментировать, увеличивая или уменьшая частоту
работы процессора и период срабатывания таймера.