Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / motorola / 68LAB3.DOC
Скачиваний:
14
Добавлен:
16.04.2013
Размер:
299.29 Кб
Скачать

Команды условного перехода с декрементом в регистре Dn

Команда DBcc (decrement and branch conditionaly) выполняет операцию декремента и осуществляет переход до тех пор, пока описанное условие не будет истинным. Основная форма записи команды декремента и перехода по условию следующая:

DBcc Dn,<label>

Сначала команда проверяет в цикле условие, заданное кодом условия сс. Если описанное условие удовлетворяется, перехода нет, и выполняется следующая команда. Если условие не удовлетворяется, младшее словосч¸тчика, представленного регистром Dn, уменьшается на 1. Если результат сч¸та не равен -1, то осуществляется переход к команде, указанной меткой <label>. В противном случае выполняется следующая команда. Надо заметить, что действие декремента команды DBcc не воздействует ни на какие флаги.

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

В следующем примере мы рассмотрим выполнение программы, похожей на описанную выше, но с дополнительным условием-выход из цикла происходит при обнаружении нулевого байта, причем количество пересылаемых байт в любом случае не должно превышать 10.

1000 LEA $1100,A0 Загрузить адрес в А0

LEA $1200,A1 Загрузить адрес в А1

MOVEQ #9,D7 Загрузить счетчик циклов (N-1)

1008 MOVE.B (A0)+,(A1)+ Перемещение байта

DBEQ D7,$1008 Повторять до тех пор , пока не встретится

* нулевой байт или не будет

* переписанно 10 байтов

NOP Точка останова

Перед выполнением программы необходимо создать в памяти, начиная с адреса $1100, массив байтов, содержащий где-либо внутри нулевой байт. Используйте команду TUTORa MM 1000;B .

Запустите программу с адреса $1000, предварительно установив точку останова на команду NOP. После выполнения программы просмотрите область памяти, начиная с адреса $1200, и убедитесь в том, что переписаны из исходного массива только начальные байты , включая и последний нулевой.

Команды работы с подпрограммами

Подпрограммы являются неотъемлемой частью любой более-менее сложной программы. Они представляют собой универсальный завершенный блок программы, используемый в различных ее частях.

Для передачи управления подпрограмме и возврата из нее в системе команд процессора МС68000 предусмотрены команды, представленные в табл. 3. Команды вызова подпрограммы автоматически сохраняют в стеке адрес возврата (содержимое РС, указывающего на команду, следующую за командой вызова), после чего выполняют переход по адресу, указанному в команду вызова тем или иным способом. Как и в командах безусловного перехода, возможны два типа вызовов подпрограммы: командой JSR (jump to subroutine) и BSR (branch to subroutine). Команда JSR позволяет задать любой адрес , допустимый для передачи управления. Переход может осуществляться в пределах всего адресного пространства. Команда BSR ограничивает длину перехода пределами относительной адресации (-32768...+32767 байт). При использовании суффикса .S получается более короткая команда, а длина перехода ограничивается -128 ...+127 байт.

Последней командой подпрограммы является команда возврата : RTS (return from subroutine) или RTR (return and restore condition codes). Эти команды восстанавливают из стека значение РС и передают управление по содержащемуся в нем адресу. Команда RTR, кроме того, восстанавливает из стека содержимое регистра ССR, если в начале подпрограммы оно было сохранено в стеке.

Рассмотрим в качестве примера программу, которая суммирует натуральный ряд чисел до заданного числа N в нисходящем порядке. Используем регистр D0 для накопления суммы, а регистр D1 - как счетчик. Само суммирование выполняет подпрограмма с именем SUM. Введите с использованием терминального сервера следующую программу:

ORG $1000Установка программного счетчика

START MOVEA.W #$1000,SP Инициализация стека

MOVE.L #5,D1Задание N

BSR.S SUMВызов подпрограммы

STOP #$2700Останов

* Начало подпрограммы суммирования натурального ряда чисел

SUM CLR.L D0Начальная сумма

LOOP ADD.L D1,D0 Накопление суммы

DBF D1,LOOPЗадание цикла

RTS Возврат из подпрограммы

END STARTКонец программы

Оттранслируйте программу и в отладчике TUTOR выполните трассировку программы. Желательно перед трассировкой установить точку останова на месте команды STOP. Проследите за изменениями регистров D0, D1, A7 и PC. Посмотрите как сохраняется в стеке адрес возврата при обращении к подпрограмме и как он снова загружается в РС при исполнении команды RTS.

Соседние файлы в папке motorola