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

Безусловные переходы

Безусловный переход выполняется без считывания содержимого регистра признаков. При этом различают абсолютную и относительную адресации. При выполнении операции абсолютно адресованного перехода (Jump) указывается адрес, на который должен перейти программный счетчик. Для этого можно использовать два рассмотренных выше способа: прямую адресацию и адресацию с индексированием. Адрес следующей команды указывается теми же способами, которые были описаны в разд. 21.2.2.

При этом программа имеет следующий вид:

Условные переходы

Условные переходы выполняются только тогда, когда установлен соответствующий признак регистра признаков. При этом применяется только относительный способ адресации. Если условие не выполняется, то перехода не происходит и программа выполняет команду, следующую за командой условного перехода с относительным способом адресации. В табл. 21.7 перечислены важнейшие команды условного перехода. В командах, которые относятся к арифметике в дополнительном двоичном коде, знак при переполнении интерпретируется верно, так как производится оценка признака переполнения. Мерой всегда служит операция, указанная в графе «Комментарии». В этой графе приведены тесты по проверке определенных двоичных комбинаций.

Поясним использование команд условного перехода на примере. Пусть необходимо загрузить массив 0, 1, 2, 3 ... в область памяти с адресами от 0200 до М-1. При этом старший байт адреса М записывается в ячейку 0000, младший байт-в ячейку 0001.

Приведенная в табл. 21.8 программа начинается с загрузки 16-разрядного числа 020016 в индексный регистр и очистки аккумулятора. Затем начинается цикл, в котором содержимое аккумулятора А записывается в память путем применения адресации с индексированием. После этого содержимое аккумулятора А и индексного регистра увеличивается на 1. Если полученный адрес оказывается меньше М, то программный счетчик возвращается к началу цикла. При этом следующее значение массива запишется в очередную ячейку и т.д. Если Х = М, то возврата к началу цикла не происходит и программа останавливается по команде WAI.

Подпрограммы

Переход к подпрограмме (BSR, JSR) является безусловным переходом, характеризующимся следующим дополнительным свойством: адрес следующей команды запоминается в специальном регистре в качестве адреса возврата из подпрограммы. Благодаря этому можно осуществлять переходы из различных мест основной программы к часто используемым стандартным подпрограммам. С помощью команды (Return from Subroutine) происходит запись адреса возврата в программный счетчик.

Возможен переход от одной подпрограммы к другой, т.е. вложение подпрограмм; для этого необходимо, пока предыдущий возврат еще не произошел, дополнительно запомнить второй адрес возврата. Первый возврат нужно осуществить по адресу, записанному последним, второй— по адресу, записанному предпоследним, и т. д. Для организации этого процесса служит специальный 16-разрядный регистр ЦПЭ, который называется указателем стека.

Для запоминания адресов возврата выделяют специальную область ОЗУ, которая для других целей не используется. Она называется стеком (Stack). Объем стека выбирают в зависимости от числа возможных вложений подпрограмм. После подключения микропроцессора верхний адрес этой области загружают в указатель стека ЦПЭ с помощью указанной в табл. 21.9 команды LDS.

Если теперь с помощью команд BSR или JSR осуществить переход к подпрограмме, то код адреса возврата (младший байт) будет автоматически записан в ячейку, адрес которой содержится в указателе стека. Затем содержимое указателя стека уменьшится на единицу и в заданную ячейку будет записан старший байт кода адреса возврата. После этого содержимое указателя стека снова уменьшится на единицу и при этом укажет адрес следующей свободной ячейки области ОЗУ, отведенной под стек.

Если при этом внутри подпрограммы осуществляется переход к следующей подпрограмме, то второй код адреса возврата таким же образом записывается в следующие две более младшие ячейки стека. Следовательно, стек всегда заполняется в направлении убывания адресов ячеек, и тем дальше, чем больше подпрограмм вложено друг в друга.

С помощью команды RTS (Return from Subroutine) последний адрес возврата переписывается из стека в программный счетчик, и содержимое указателя стека увеличивается на два. Таким образом, адреса возврата обрабатываются, как это и требуется, в порядке, обратном их поступлению. Стек можно использовать для промежуточного запоминания содержимого аккумулятора. Для этого служат команды PSH А и PSH В с неявной адресацией, которые осуществляют запоминание содержимого регистров А и В в той ячейке, адрес которой задает указатель стека. После этого содержимое стека уменьшается на единицу, так как длина слова данных в отличие от длины слова адреса составляет всего 8 бит.

С помощью команд PUL A или PUL B данные извлекаются из стека. Ясно, что данные, которые были подвергнуты промежуточному запоминанию в стеке, должны быть снова возвращены в ту же подпрограмму, так как в противном случае адреса возврата и данные перемешаются.

Прерывания

Прерывающая программа представляет собой особую форму подпрограммы. Она отличается от обычных подпрограмм тем, что выход из текущей программы осуществляется не с помощью команды перехода, которая находится в определенном месте программы, а произвольно по запросу внешнего управляющего сигнала. Этот управляющий сигнал необходимо подать на вход прерываний IRQ (Interrupt Request) ЦПЭ.

Начальный адрес прерывающей программы запоминается в специальных ячейках, находящихся за. пределами программы. Для этой цели в микропроцессоре МС 6800 выделены ячейки FFF 8 (старший байт) и FFF 9 (младший байт).

Так как выход может произойти в любом месте текущей программы, то необходимо позаботиться о том, чтобы эта программа безошибочно могла продолжить свою работу после возврата из прерывающей программы. Для этого нужно восстановить первоначальные данные в рабочих регистрах ЦПЭ. С этой целью при прерывании содержимое регистров аккумуляторов А и В, индексного регистра и регистра признаков запоминается в стеке. По команде RTI (Return from Interrupt) эта информация возвращается в ЦПЭ.

Рис. 21.4. Пример содержимого стека.

В качестве примера рассмотрим содержимое стека после прерывания, которое иллюстрирует рис. 21.4. При этом будем исходить из того, что к моменту прерывания выполнялась вторая подпрограмма, а в течение первой подпрограммы еще не законченной, содержимое аккумуляторов А и В запоминается в стеке.

После окончания прерывающей программы осуществляется возврат во вторую подпрограмму, а из нее-в первую подпрограмму. В приведенном примере обе команды PSH необходимо затем дополнить соответствующими командами PUL, которые обеспечат возврат в основную программу. В этом состоянии указатель стека снова задает старший адрес стека (например: 07FF).