Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Lab_moto / 2.doc
Скачиваний:
16
Добавлен:
16.04.2013
Размер:
265.73 Кб
Скачать

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

Исследуем работу команд 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различные значения.

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