
- •Лабораторная работа n2.
- •1.1 Центральный процессор.
- •1.2. Карта памяти. Назначение регистров.
- •Регистр конфигурации (option).
- •Регистры данных портов (dRn) и установки направления передачи данных (ddRn).
- •Регистры управления (scr), состояния (ssr) и данных (sdr) порта последовательного интерфейса.
- •Регистры сброса (coprst) и управления сбросом (copcr).
- •1.3. Методы адресации.
- •1.4 Команды пересылки данных.
- •1.5. Команды передачи управления.
- •2. Практическая часть1.
- •2.1. Команды пересылки данных.
- •Команды загрузки регистров а и х данными из памяти.
- •Команды модификации памяти.
- •Команды межрегистровой пересылки.
- •Команды условного перехода.
- •Команды работы с подпрограммами.
- •Команда установки указателя стека в стандартное состояние.
- •Контрольные вопросы.
- •Задания.
Команды работы с подпрограммами.
Исследуем работу команд 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 различные значения.