Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
16.04.2013
Размер:
142.03 Кб
Скачать

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, в котором будет

храниться введенное шестнадцатиричное число

Соседние файлы в папке Motorola - Описание лаб