- •Микропроцессор мс68000
- •Обработка исключительных ситуаций.
- •Виды исключительных ситуаций.
- •Многократные ис.
- •Практическая часть.
- •1100 Lea 1200,a5 адрес начала сообщения
- •1100 Move.L a7,a0 копирование указателя стека
- •111Е move.L d1,d2 иначе выполняется операция вычитания
- •100А move.B #247,d7 установка функции ввода символа с
- •103С chk d1,d2 проверка размерности
- •1108 Cmpa.L a5,a6 конец строки?
- •Контрольные вопросы и задания
- •1. В чем состоит различие между прерываниями и исключительными ситуациями?
- •1. Напишите подпрограмму перехода из пользовательского режима в режим супервизора с использованием команды эмулятора.
1100 Lea 1200,a5 адрес начала сообщения
LEA 120A,A6 адрес конца сообщения
MOVE.B #243,D7 выбор функции вывода строки символов на
терминал
TRAP #14 вывод строки
ADDA.L #2,A7 указатель стека на сохраненное значение РС
MOVE.L #$801FE4,(A7) усатовить адрес возврата на ячейку памяти
$801FE4
SUBA.L #2,A7 указатель стека на значение регистра статуса
RTE возврат из подпрограммы
1200 DC.W 'DI'
DC.W 'V0'
DC.W ' E'
DC.W 'RR'
DC.W 'OR'
DC.W 00
Запустите программу с адреса $1000. Во время выполнения команды деления происходит генерация ИС "деление на ноль" и передается управление подпрограмме обработки ИС по адресу $1100. Подпрограмма выводит сообщение "DIV0 ERROR" и переходит в TUTOR.
Неопознанные команды и эмулятор.
Если первое слово операции не может быть опознано процессором как код команды, то процессор генерирует ИС с вектором номер 4. Часто эта ИС используется для распознавания команд более поздних процессоров семейства Motorola.
Если старшие 4 бита кода операции (op code) будут равны 1010 или 1111, генерируется ИС с вектором 10 или 11 соответственно. Команды с такими кодами назваются командами эмулятора и используются, например, для эмуляции команд сопроцессора в случае его отсутствия. Ниже мы рассмотрим пример подпрограммы, которая обрабатывает ИС с вектором 11. В зависимости от того установлен или нет 1-й бит команды эмулятора, подпрограмма производит либо сложение регистров D0 и D1, либо вычитание значения регистра D0 из регистра D1 с записью результата в регистр D2 (в реальных программных продуктах эмулируются, например, арифметические команды с плавающей точкой).
1000 MOVE.L #$1100,$02C переадресация вектора ИС на подпрограмму ее
обработки
MOVEQ #$3,D0 предварительная запись операндов в D0
MOVEQ #$10,D1 è D1
DC.W $F001 команда эмулятора
1100 Move.L a7,a0 копирование указателя стека
ADDA.L #2,A0 перемещение указателя стека на ячейку памяти, хранящую содержимое РС на момент
генерации ИС
MOVEA.L (A0),A1 запись адреса команды эмулятора в регистр А1
ADD.L #2,(A0) увеличиваем значение РС, хранящегося в стеке,
на 2, т.е. он будет указывать на следующую
после эмулятора команду
MOVE.W (A1),D5 запись команды эмулятора в регистр D5
BTST #1,D5 выбор операции:
BNE $111Е если 1-й бит не установлен, то выполняется
MOVE.L D1,D2 операция сложения D0 и D1
ADD.L D0,D2 с записью результата в D2
RTE возврат из подпрограммы
111Е move.L d1,d2 иначе выполняется операция вычитания
D0 èç D1
SUB.L D0,D2 с записью результата в D2
RTE возврат из подпрограммы
Для выполнения данной программы сначала необходимо установить точку останова по адресу $100Eи только после этого запустить программу командойG 1000.
В основной программе происходит загрузка операндов в регистры D0 и D1, после чего процессор считывает слово $F001 и генерирует ИС.
Так как в результате обработки ИС в стеке сохраняется адрес команды эмулятора, а не последующей, то в подпрограмме обработки ИС нам необходимо не только получить для обработки команду эмулятора, не изменив последовательности хранения данных в стеке, но и подставить вместо хранящегося в стеке значения РС новое, указывающее на следующее после эмулятора слово. Это выполняется с помощью первых пяти команд подпрограммы обработки ИС.
Затем в зависимости от первого бита командного слова, вызвавшего ИС, которое хранится в D5, подпрограмма производит необходимые вычисления. Поскольку в нашем случае первый бит равен 0, выполняется операция сложения D0 и D1 с записью результата в D2, в чем необходимо убедится.
Повторите эксперимент используя в качестве команды эмулятора слово $F002 и убедитесь, что в этом случае выполняется операция вычитания.
Прерывания от внешних устройств.
В данном эксперименте мы рассмотрим последовательность обработки внешних прерываний на примере немаскируемого прерывания с автовектором, возникшего при нажатии на кнопку ABORT. При нажатии на эту кнопку генерируется ИС с вектором ¹31 и передается управление подпрограмме обработки расположенной по адресу $1100.
1000 MOVE.L #$1100,$7C Записываем новый адрес
подпрограммы обработки
прерывания автовектора ¹7.
BRA $1008 Пустой цикл.
1100 MOVEQ #34,D0 Запись числа $34 в регистр D0.
RTE Возврат из подпрограммы.
Первая часть программы, состоящая из двух команд, записывается по адресу $001000 и меняет адрес подпрограммы обработки прерывания.
Последние две команды представляют собой подпрограмму обработки прерывания, и записываются по адресу $001100.
Для выполнения программы необходимо установить точку останова по адресу $00100А командой BR 100A, а затем запустить ее командойG 1000.
Процессор будет выполнять пустой цикл до тех пор пока не будет нажата кнопка ABORT, после чего будет выполнятся подпрограмма обработки прерывания, заключающаяся в пересылке байта $34 в регистр D0. Следующей командой процессор осуществит возврат из подпрограммы и выйдет из пустого цикла по адресу $00100A потому, что значение РС сохраненное в стеке при генерации прерывания указывает на следуещее после пустого цикла слово.
Программные ИС.
В наборе команд МП МС68000 присутствуют специальные команды инициализации ИС: TRAP (запуск прерывания с вектором, заданным в виде операнда), TRAPV (запуск прерывания по флагу переполнения) и CHK (проверка регистра по границам). В данной лабораторной работе мы рассмотрим две из них: команды TRAP и CHK.
Команда TRAP #14.
Команда TRAP фактически представляет собой 16 команд TRAP #I, где I=0, 1, ..., 15, осуществляющих запуск одного из 16 ИС с векторами 32-47. Команда TRAP очень часто используется для унификации программ, написанных для различных систем на базе процессора МС68000, используя TRAP с определенным номером для реализации конкретной функции, например, вывод на терминал, ввод с терминала, чтения записи на диск и т.д. В нашем случае программа-монитор TUTOR использует ИС с вектором ¹47 для ввода-вывода информации через порты ввода-вывода, а также для преобразования ASCII символов в шестнадцатиричное число и обратно. В общей сложности данное прерывание обрабатывает 256 функций, номер каждой из которых определяется младшим байтом регистра D7. Более подробно функции TRAP, реализованные в TUTOR, представлены в описании "Одноплатный компьютер SBC68K", здесь же рассмотрим несколько примеров:
Для вывода строки текста на терминал, используется TRAP #14 параметром 243 в D7. Адрес начала символьной строки должен находится в А5, окончание в А6. Рассмотренный ниже пример позволяет вывести на экран терминала сообщение "HELLO!".
LEA $1100,A5 адрес начала строки
LEA $1106,A6 адрес конца строки
MOVE.B #243,D7 выбор функции вывода на терминал строки
символов
TRAP #14 вызов ИС
1100 DC.W 'HE'
DC.W 'LL'
DC.W 'O!'
1106 DC.W 00
Выполнитепрограмму и убедитесь в правильности работы.
Для ввода символа с терминала в младший байт регистра D0, служит команда TRAP #14 параметром 247 в D7.
1000 MOVE.B #247,D7
TRAP #14
После запуска этой программы компьютер ожидает нажатия любой клавиши, после чего записывает полученный ASCII код в младший байт регистра D0, в чем легко убедится, выполнив программу и просмотрев содержимое регистра D0.
Для преобразования ASCII символа в шестнадцатиричное число служит команда TRAP #14 с параметром 235.
MOVE.B #235,D7
TRAP #14
Если выполнить эту команду вслед за предыдущей, то хранящийся в регистре D0 код символа, введенного предыдущей командой, будет преобразован в шестнадцатиричное число, которое запишется в младшие 4 бита регистра D0, в чем несложно убедится.
Команда CHK EA,Dn.
Команда CHK записывается в мнемонической форме следующим образом: CHK EA, Dn. Эта команда генерирует ИС с вектором 6 в случае если младшее слово регистра Dn меньше нуля или больше определенной величины, заданной словом находящимся в ЕА. Таким образом, эту команду можно использовать, например, для контроля за размерностью массивов, границами вводимых переменных.
В рассматриваемой ниже программе используются два вида контроля за границами вводимых с клавиатуры значений: в виде отдельных команд сравнения и с помощью ИС CHK.
С помощью команд сравнения производится проверка на то, что введенный символ соответствует шестнадцатеричной цифре, т.е. его ASCII код не меньше 30 ('0'), не более 46 ('F') и не равен 40 ('@'). Также командй сравнения проверяется нажат ли Enter.
Командой CHK в данной программе производится контроль границ уже введенного числа, которое хранится в регистре D2. Нижняя граница равна нулю, а верхняя перед запуском программы записывается в регистр D1.
1000 MOVE.L #$18,$1100 переадресация вектора ИС команды CHK на
подпрограмму обработки по адресу $1100
CLR.L D2 обнуление регистра D2, в котором будет
храниться введенное шестнадцатиричное число