- •Микропроцессор мс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. Напишите подпрограмму перехода из пользовательского режима в режим супервизора с использованием команды эмулятора.
Многократные ис.
Существует вероятность того, что одновременно возникнут несколько ИС. В этом случае процессор будет обрабатывать их в порядке старшинства приоритета.
Группа 0: конец машинного такта. приоритет
RESET âûøå
ошибка шины
ошибка адреса
Группа 1: конец операции.
трассировка
прерывания
Группа 2 конец цикла шины.
неопознанная команда
команда эмулятора
нарушение привилегированности
Группа 3: во время выполнения команды. ниже
TRAP, TRAPV, CHK, деление на ноль.
ИС группы 0 распознаются в конце машинного такта. Эти ИС имеют наивысший приоритет и выполняются немедленно. ИС группы 1 имеют более низкий приоритет и распознаются после выполнения текущей команды. ИС группы 2 распознается после выборки команды. Самый низкий приоритет имеют группа 3 распознающиеся во время выполнения команды.
Если одновременно поступает ИС нулевой группы и любое другое ИС более низкого приоритета, то выполняется ИС нулевой группы, а второе игнорируется.Если одновременно поступают два ИС из любых ненулевых групп, то выполняются оба, сначала с более высоким приоритетом, затем с низким.
Практическая часть.
В данной практической работе мы рассмотрим следующие виды ИС:
·ИС "ошибка адреса".
·ИС "ошибка шины".
·ИС "деление на ноль"
·неопознанные команды и эмулятор.
·прерывание от внешнего устройства.
·программные ИС:
а. команда TRAP #I;
b. команда CHK EA,Dn.
ИС "ошибка адреса"
Формирование процессором нечетного адреса при операции со словом или длинным словом является ошибочным. При попытке обращения к нему для выборки команды, операнда слова или длинного слова процессор вырабатывает ИС "ошибка адреса" с вектором 3. В отличии от обычной ИС в этом случае сохраняется адрес не следующей команды, а адрес текущей команды плюс десятичное число от 2 до 10 в зависимости от того в какой момент времени произошла ИС, т.е. значение РС, сохраненое в стеке, точно не определено. Кроме того, для упрощения обработки ошибки вместе с регистрами SR и РС в стеке супервизора сохраняется дополнительная информация, включающая в себя командное слово операции, вызвавшей ИС, ошибочный адрес и слово состояния шины. В приведенном ниже примере мы вызовем эту ИС с помощью неверной команды и проанализируем сохраненную в стеке дополнительную информацию.
1000 MOVE.L #$1100,$0C переадресация вектора ИС "ошибка
адреса" на подпрограмму ее обработки,
расположенную по адресу $1100
MOVE.L #$12345678,$1233 неверная пересылка
1100 MOVE.W (A7)+,D1 запись слова состояния шины в регистр D1
MOVEA.L (A7)+,A1 запись ошибочного адреса в регистр А1
SWAP D1 перемещение слова состояния шины в
старшее слово регистра D1
MOVE.W (A7)+,D1 запись командного слова операции,
вызвавшей ошибку, в регистр D1
RTE возврат из подпрограммы обработки ИС
Перед запуском данной программы установите точку останова по адресу слова, следующего за командой MOVE.L #$12345678,$1233. После этого запустите программу командой G 1000.
Первая команда программы записывает адрес подпрограммы обработки ИС в память по адресу $0C, соответствующего вектору ¹3 (см. таблицу векторов ИС в теоретической части). При выполнении следующей (ошибочной) команды возникает ИС с вектором ¹3, в стеке сохраняются текущие значения регистра статуса и программного счетчика, а также дополнительная информация, описанная выше. Затем процессор переходит к выполнению подпрограммы обработки ИС по адресу $1100. В этой подпрограмме из стека извлекается дополнительная информация и записывается в внутренние регистры. Необходимо отметить, что в общем случае невозможно выйти из подпрограммы обработки ИС "ошибка адреса" или "ошибка шины" обычными методами (используя сохраненный в стеке программный счетчик), т.к. его значение точно не определено. В нашем примере это представляется возможным благодаря тому, что ИС возникает после считывания последнего слова команды MOVE.L #$12345678,$1233 и таким образом значение РС указывало наследующее после команды слово.
По завершению работы программы просмотрите внутренние регистры процессора: в регистре А1 хранится ошибочный адрес $1233; младшее слово регистра D1 содержит командное слово операции вызвавшей ошибку $21FC соответствующее команде MOVE.L #$12345678,$1233 и, наконец, в старшем байте находится слово состояния шины $21E5. Слово состояния шины показывает, что ошибка произошла при попытке записи (R/W=0) данных в режиме супервизора (функциональный код равен 101) во время выполнения обычной команды (I/N=0).
ИС "ошибка шины"
В приведенном ниже примере, при попытке записи в области памяти, относящиеся к ПЗУ, генерируется ИС "ошибка шины" с вектором номер 2. В общем случае это происходит при обращении к несуществуещей памяти или какой либо неисправности в апаратной части (внешняя логика выставляет сигнал BERR, который и генерирует ИС). Немедленно прекращается выполнение цикла и запускается процесс обработки ИС. Дополнительная информация, сохраняемая в стеке, и механизм обработки такие же, как и в случае ИС "ошибка адреса". Как и в предыдущем эксперименте, в рассмотренном ниже примере мы проанализируем дополнительную информацию полученную генерацией ИС "ошибка шины". В этом примере мы будем использовать без изменений подпрограмму обработки ИС взятую из предыдущего эксперимента.
1000 MOVE.L #$1100,$08 переадресация вектора ИС
MOVE.L #$12345678,$800D00 попытка записи в ПЗУ
Перед выполнением эксперимента установите точку останова по адресу слова следующим за командой MOVE.L #$12345678,$800D00. Затем запустите выполнение командой G 1000. По завершению работы программы просмотрите внутренние регистры процессора, содержимое которых имеет тот же смысл, что и в предыдущем эксперементе.
ИС "деление на ноль"
Если происходит деление числа на ноль, то результат, естественно, не имеет смысла. Для этих случаев разработчики МС68000 предусмотрели специальную ИС "деление на ноль" с вектором 5. В рассмотренном ниже примере выполняется команда деления на ноль, в следствии чего гененрируется ИС "деление на ноль". Подпрограмма обработки ИС расположенна по адресу $1100.
1000 MOVE.L #$1100,$14 переадресация вектора ИС на подпрограмму ее
обработки
MOVEQ #$3,D0 предварительная запись операнда в D0
DIVU #0,D0