|
В начало
Лабораторная работа.
Методы адресации, команды передачи
данных и управления
Цель
работы – изучение методов
адресации, команд передачи данных и управления. 1. Общие
сведения При создании программы для микроконтроллера на языке Ассемблер разработчик
оперирует программно-доступными ресурсами микропроцессорной системы. У микроконтроллера
ATmega128 эти ресурсы включают: программно-доступные регистры микроконтроллера,
внутреннюю память данных, внешнюю память данных. Каждая команда языка Ассемблер сообщает процессору выполняемую операцию
и методы доступа к операндам. Командная строка Ассемблера включает метку
(символический адрес), мнемонику (символическое имя) команды, поле операндов,
комментарий [1]. Методы адресации представляют собой набор механизмов доступа к операндам.
Одни из них просты и поэтому приводят к компактному формату команды и быстрому
доступу к операнду, но объем доступных с их помощью ресурсов ограничен. Другие
методы адресации позволяют оперировать со всеми имеющимися в системе ресурсами,
но команда получается длинной, на ее ввод и выполнение тратится много времени.
Набор методов адресации в каждой системе команд является компромиссным
сочетанием известных механизмов адресации, выбранных проектировщиками
архитектуры исходя из набора решаемых задач. Заметим, что при двух операндах и приемнике
результата имеет место трехадресная команда и каждый
адрес формируется с использованием собственного метода адресации. Если адрес
операнда или приемника результата не указан в команде, а подразумевается, то имеет
место неявная адресация. В программах для микроконтроллера ATmega128 используется
прямая, косвенная и относительная адресации. На рис.14 – 25 приведены схемы методов
адресации. Рис. 14. Регистровая
адресация (один регистр общего назначения)
Рис. 15. Регистровая
адресация (два регистра общего назначения)
Рис. 16. Регистровая
адресация (регистры ввода-вывода)
Рис. 17. Прямая адресация
данных Рис. 18. Косвенная
адресация данных со смещением
Рис. 19. Косвенная
адресация данных
Рис. 20. Косвенная
адресация данных с преддекрементом
Рис. 21. Косвенная
адресация данных с постинкрементом
Рис. 22. Адресация
константы в памяти программ в командах LPM и ELPM
Рис. 23. Прямая
адресация памяти программ в командах JMP и CALL
Рис. 24. Косвенная
адресация памяти программ в командах IJMP и ICALL
Рис. 25. Относительная
адресация памяти программ в командах RJMP и RCALL Команды
передачи данных приведены в табл. 2. Таблица. Команды пересылки данных
Окончание табл. 2
Из
таблицы видно, что набор этих команд представляет собой сочетание восьми
операций с различными методами адресации. Команды ELPM и LPM выполняют загрузку памяти программ. Команда MOV копирует содержимое одного регистра общего назначения
в другой. Команда LDI загружает регистр общего
назначения непосредственно константой (только R16 – R32), а команды LD выполняют загрузку регистра из ячейки ОЗУ при
косвенной адресации, используя в качестве источника адреса регистры X, Y, Z, а также варианты с постинкрементом
и преддекрементом источника. Команда LDD выполняет эту же операцию при помощи косвенной
адресации со смещением. Команда LDS загружает в
регистр общего назначения содержимое прямо адресуемой ячейки памяти данных. Команда ST выполняет обратную операцию относительно LD – заносит в косвенно адресуемую ячейку памяти данных
содержимое регистра общего назначения, используя также варианты с постинкрементом и преддекрементом
адреса. Команда STD выполняет эту же операцию при
помощи косвенной адресации со смещением, а команда STS прямо адресует ячейку ОЗУ. Команда IN заносит содержимое регистра ввода-вывода в регистр общего
назначения, а команда OUT выполняет
обратную операцию. Команда PUSH сохраняет содержимое регистра в стеке, а команда POP выполняет обратную операцию. При выполнении этих
команд кроме программного счетчика изменяется и значение указателя стека SP. Команды
передачи управления (переходов) приведены в табл. 3. Таблица. Команды
переходов
Продолжение табл. 3
Окончание табл. 3
Из
табл. 2 и 3 видно, что команды пересылки данных и команды переходов значения
флагов регистра SREG не изменяют. 2. Домашнее
задание 1. Изучить описание структуры микроконтроллера ATmega128 и интегрированной системы его программирования на
языке Ассемблер AVRStudio. 2. Изучить реализуемые микроконтроллером способы адресации и команды
пересылки данных. 3. Порядок выполнения работы 1. Запустить на персональном компьютере
интегрированную систему программирования AVRStudio. Командой Project | New Project создать новый проект Lesson1. С использованием редактора текста создать
демонстрационную программу: .device ATmega128 .include
"m128def.inc" ;***** Инициализация
указателя стека ********************** ldi R20,$FF;
загрузка промежуточного регистра R20 младшим ; байтом адреса начала стека out SPL,R20; загрузка младшего байта
указателя стека ldi R20,$10;
загрузка промежуточного регистра R20 старшим ; байтом адреса начала стека out SPH,R20; загрузка старшего байта
указателя стека ;***** Выполнение команд
пересылок ************************** ldi R20,$57; загрузка регистра R20
константой ldi R30,$00;загрузка
регистровой пары Z (R30,R31) с адресом $0100 ldi R31,$01;по
которому расположена первая ячейка внутреннего ОЗУ st Z,R20 ;загрузка косвенно адресуемой ячейки ОЗУ с адресом
$0100 ; значением из регистра R20
($57) lds R19,$0100
; загрузка регистра R19 из ячейки ОЗУ с адресом $0100 sts $0101,R19;загрузка ячейки с адресом
$0101 из регистра R19 call Rout ; вызов подпрограммы Rout loop: rjmp loop ; зацикливание программы ;*** Подпрограмма
копирования значения из памяти программ *** Rout: push R30 ; сохранение указателя Z в
стеке push R31 ldi R20, $00; загрузка регистра R20
новой константой ldi R30, $80; загрузка регистровой
пары Z удвоенным адресом ячейки ldi R31, $00; памяти программ lpm ; загрузка регистра R0
значением ячейки памяти программ с адресом $0040 cpse R0,R20 ;
пропустить следующую команду ;если значения регистров R0 и R20 равно sts
$0102,R0 ; загрузка ячейки ОЗУ с адресом $0102 из регистра R0 pop R31 ; извлечение указателя Z из
стека pop R30 ret ; возврат из подпрограммы ;********************************************************* 2. Выполнить команду Project/Build для
компиляции проекта. 3. С помощью команды Debug/Start
Debugging запустить симулятор. Командой View/Memory открыть
окно с ячейками памяти программ. Прямым редактированием занести любой код в
ячейку $40 памяти программ. 4. Выполнить программу по шагам, выполняя команду Debug/Step Intro (F11). После выполнения текущей команды курсор
в окне редактора текста указывает на следующую команду. 5. Проверить правильность
пересылки данных. 6. Составить программу выполнения заданной преподавателем последовательности
операций передачи данных, провести пошаговый прогон программы,
продемонстрировать полученный результат. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||