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

1010 Nop Точка останова.

Выполните программу начиная с адреса $1000 в пошаговом режиме, обращая особое внимание на изменение содержимого регистра статуса и адреса переходов. После выполнения команды CMP.L D0,D1 будет установлен флак переноса, таким образом условие перехода BHI (C+Z=0) будет ложно и переход к указанной метке не произойдет, а будет выполнятся следующая команда.

Поменяйте начальные данные в регистрах D0 и D1 между собой, и повторите эксперемент.

Использование команд условного перехода в формировании циклов типа WHILE...DO-следующий характерный пример их эффективного использования. Пусть нам нужно переместить N слов из области памяти, начинающейся с адреса, записанного в регистре A0, в область памяти, начинающуюся с адреса, хранящегося в регистре A1, конец последовательности нулевое длинное слова. Программа, производящая эти действия, приведена ниже:

1000 LEA $1100,A0

LEA $1200,A1

1008 MOVE.L (A0)+,(A1)+ перенос слова с постинкрементом адреса

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

нулевое длинное слово.

NOP

Перед выполнением программы необходимо создать в памяти, начиная с адреса $1100, массив данных оканчивающийся на нулевое длинное слово (длина массива должна быть около 5-6 длинных слов). Это, например, можно сделать с помощью команды MM 1000;L.

В данном эксперементе, наряду с изучением команд условного перехода мы также ознакомимся со спосабами отладки таких программ.

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

Обнулите область памяти с адреса $1200 длинной, соответствующей длине исходного массива. Установите по адресу $100А точку останова командой BR 100A;2. Теперь после запуска программы цикл будет выполнен два раза после чего остановится по адресу $100A. Просмотрите область памяти по адресу $1200-к этому моменту должно быть переписанно только три элемента массива. Закончите выполнение программы в пошаговом режиме следя за изменениями регистра статуса. Убедитесь, что цикл выполняется при сброшенном Z флаге и завершается как-только этот флаг устанавливается, т.е. произошла пересылка нулевого длинного слова.

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

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

DBcc Dn,DST

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

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

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

1000 LEA $1100,A0

LEA $1200,A1

MOVEQ #9,D7

1008 MOVE.L (A0)+,(A1)+ перенос слова с постинкрементом адреса

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

нулевое длинное слово или не будет

переписанно 10 длинных слов.

NOP

Перед выполнением программы необходимо создать в памяти, начиная с адреса $1100, массив данных оканчивающийся на нулевое длинное слово (длина массива должна быть около 5-6 длинных слов). Это, например, можно сделать с помощью команды MM 1000;L.

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

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

Измените количество элементов начального массива до 13. Повторите эксперемент с новым массивом, не изменяя условия выхода из цикла. Отметьте, что цикл завершился по изменению содержимого младшего слова регистра D7 с $0000 на $FFFF, при этом состояние флагов регистра статуса не изменилось.

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