- •Микропроцессор мс68000
- •Команда dBcc
- •Команда Scc
- •Команды jmp, nop и stop
- •Управляющие конструкции
- •Работа с подпрограммами.
- •Практическая часть.
- •Команды безусловной передачи управления .
- •Команды условного перехода.
- •1010 Nop Точка останова.
- •Команды условного перехода с декрементом в регистре.
- •Команды работы с подпрограммами
- •Подпрограмма вывода списка слов на терминал output bsr ent Перевести строку
- •Подпрограмма перевода строки
- •Контрольные вопросы и задания.
- •Команды Bcc и bra.
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, при этом состояние флагов регистра статуса не изменилось.