Доступ к памяти программ осуществляется следующим образом: во время выполнения одной команды следующая команда выбирается из памяти программ. Это дает возможность выполнять по одной команде за каждый машинный цикл.
При помощи команд относительных переходов и вызова подпрограмм осуществляется доступ ко всему адресному пространству. Большая часть команд микроконтроллеров AVR имеет размер 16-разрядов одно слово. Каждый адрес в памяти программ содержит одну 16- или 32-разрядную команду.
При обработке прерываний и вызове подпрограмм адрес возврата запоминается в стеке. Стек размещается в оперативной памяти данных общего назначения (SRAM), его размер ограничен только размером доступной памяти SRAM и ее использованием в программе. Все программы пользователя должны инициализировать указатель стека (SP) сразу после запуска микроконтроллера, до того как вызываются подпрограммы и разрешаются прерывания. Исключение составляют микроконтроллеры, не имеющие оперативной памяти данных (SRAM), например, AT90S1200. У этих микроконтроллеров реализован аппаратный стек глубиной 3. Это обязательно следует учитывать при написании для них программ.
Рис. 2.5. Структура памяти микроконтроллеров AVR
Все пространство памяти AVR является линейным и непрерывным.
Модуль прерываний имеет собственный управляющий регистр в пространстве ввода/вывода, и флаг глобального разрешения прерываний в регистре состояния. Каждому прерыванию назначен свой вектор в начальной области памяти программ. Различные прерывания имеют приоритет в соответствии с расположением их векторов. По младшим адресам расположены векторы с большим приоритетом.
Прямая регистровая адресация с одним регистром Rd
Данные, над которыми осуществляется операция (или используются при выполнении операции), находятся в регистре d (Rd).
Прямая регистровая адресация с двумя регистрами — Rd и Rr
Данные, над которыми осуществляется операция, находятся в регистрах r(Rr) и d(Rd). Результат операции сохраняется в регистре d (Rd).
Рис. 2.6. Прямая регистровая адресация с одним регистром
Рис. 2.7. Прямая регистровая адресация с двумя регистрами
Прямая адресация к области ввода/вывода
Рис. 2.8. Прямая адресация к области ввода/вывода
n — адрес регистра, используемого в операции, находится непосредственно в коде команды, в битах 0…5.
Прямая адресация к памяти данных
Рис. 2.9. Прямая адресация к памяти данных
16-разрядный адрес ячейки памяти данных находится в коде команды, состоящей из двух слов. Rr/Rd определяет регистр, используемый при работе с памятью данных (т. е. регистр, куда записываются результаты операции либо откуда они берутся для выполнения операции).
Косвенная адресация к памяти данных со смещением
Рис. 2.10. Косвенная адресация к памяти данных со смещением
Адрес операнда определяется как сумма содержимого Z или Y регистра и бит 0…5 кода команды.
Косвенная адресация к памяти данных
Рис. 2.11. Косвенная адресация к памяти данных Адрес операнда находится в Х-, Y- или Z-регистре.
Косвенная адресация к памяти данных с предварительным декрементом
Рис. 2.12. Косвенная адресация к памяти данных с предварительным декрементом
Адрес операнда находится в Х-, Y- или Z-регистре. Однако перед выполнением операции соответствующий индексный регистр Х-, Y- или Z уменьшается на единицу.
Косвенная адресация к памяти данных с постинкрементом
Рис. 2.13. Косвенная адресация к памяти данных с постинкрементом