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

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

Исследуем работу команд JSR, BSR и RTS на следующих примерах:

1. Рассмотрим пример построения цикла с декрементом:

0100 LDA #$03 заносится в аккумулятор количество

повторений

0102 TAX в индексный регистр помещается $03

0103 JSR $0106,X вызов подпрограммы, в которой

декрементируется счетчик (заметьте, что

здесь применена индексная адрессация)

0106 BNE $0103 если счетчик не занулился, то следующая

итерация

0108 NOP здесь будет стоять точка останова

0109 DECA собственно уменьшение счетчика

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

Установите точку останова по адресу $0108. Протрассируйте программу. Заметьте, что подпрограмма по адресу $0109 выполнится три раза. Проверьте, что число, хранящееся в стеке по адресам SP, SP-1, соответствует числу $0501 (т.е. адресу возврата из подпрограммы) с измененным порядком следования старшего и младшего байтов и не меняется после выполнения программы, т.е. команда возврата из подпрограммы не изменяет содержимого стека. При этом, если вы находитесь в подпрограмме, то данное число находится над указателем стека (SP+2, SP+1).

2. Рассмотрим пример построения цикла с инкрементом:

0100 LDA #$FD заносится в аккумулятор минус 3, т.е.

количество повторений с обратным

знаком

0102 BSR $0107 вызов подпрограммы, в которой

инкрементируется счетчик

0104 BNE $0102 если счетчик отличен от нуля, то

необходимо повторить цикл

0106 NOP здесь будет стоять точка останова

0107 INCA собственно увеличение счетчика

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

Проведите действия, аналогичные п.1, за исключением того, что точку останова надо поставить по адресу $0106. Убедитесь, что программа аналогична вышеприведенной, но число под стеком равно $0401.

Команда установки указателя стека в стандартное состояние.

Рассмотрим работу команды RSP на следующем примере:

0100 JSR $0103 уменьшение стека на $0002

0103 RSP загрузка в регистр SP значения $FF

Протрассируйте программу. Убедитесь в том, что команда RSP заносит в регистр SP значение $FF. Заметьте, что в отличие от команд группы LD команда RSP не изменяет регистр признаков.

Исследуем программу, использующую изученные выше команды и осуществляющую поиск значения $02 в памяти с адреса $0001 по адрес $00FF (адрес, по которому расположено искомое значение, после выполнения находится в регистре X; если искомое значение не найдено, то в регистре X находится $00):

0100 LDX #$01 начальный адрес

0102 LDA ,X выборка байта из памяти

0103 #$02 сравнивается со значением $02

0105 BEQ $010A если $02, то конец

0107 INCX иначе увеличение Х

0108 BNE $0102 и переход на следующую итерацию

010A NOP здесь могла бы быть полезная программа,

но в нашем случае-точка останова

Команда CMP производит вычитание аргумента из аккумулятора, устанавливая флаги в соответствии с полученным результатом. При этом результат не сохраняется.

Установите точку останова по адресу $010A. Поэкспериментируйте с программой, присваивая ячейкам памяти $0001-$00FF различные значения.

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