- •Микропроцессор мс68000
- •Команда dBcc
- •Команда Scc
- •Команды nop и stop
- •Управляющие структуры
- •Практическая часть.
- •Команды безусловной передачи управления .
- •Команды условного перехода.
- •Команды условного перехода с декрементом в регистре Dn
- •Команды работы с подпрограммами
- •Контрольные вопросы и задания.
Команды условного перехода с декрементом в регистре 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.