Система команд

Система команд

Микроконтроллеры AVR имеют систему сокращенного набора команд RISC, хотя целиком и не полностью попадают под это определение.

Система RISC подразумевает полную симметрию между ресурсами памяти разного типа. Это, в частности, позволяет обращаться к регистрам, портам и памяти данных одними и теми же командами, что и обуславливает их небольшое количество. Однако, не смотря на то, что адресное пространство памяти AVR действительно непрерывно, всё же три разных его области используются только для своих специфических целей. РОН – преимущественно для математических операций, РВВ – для управления процессором, ОЗУ – только как хранилище информации. В связи с этим существуют группы команд как для работы с каждым видом памяти в отдельности, так и для пересылки данных из одной области памяти в другую. Поэтому и количество команд AVR достаточно велико. В фирменной документации, где много говорится про ортогональность ядра, в первую очередь имеется в виду полная равноправность именно РОН.

Система команд линейки ATtiny является подмножеством системы команд старшего семейства ATmega. В ряде старых моделях ATtiny могут отсутствовать некоторые аппаратные узлы (индексные регистры X,Y, программный стек, память ОЗУ и др.) и, соответственно, отсутствовать связанные с ними команды. Система же команд ATtiny более позднего времени выпуска практически аналогична семейству ATmega. Главное отличие обеих семейств – отсутствие встроенного умножителя у ATtiny (отсутствие группы команд умножения).

Разные модели ATtiny могут иметь (90…120) команд. ATmega поддерживают (130…135) инструкций. Так заявлено в спецификациях Atmel. Но фактическое число, на самом деле, значительно меньше.

Это связано с тем, что в ассемблере AVR встроен ряд макроопределений, эквивалентных реальным командам, но имеющих иной символический вид. Так, например, у команды ori Rd,K существует команда двойник sbr Rd,K, которая выполняет тоже действие (Rd = Rd OR K) и имеет такой же код операции. Аналогичные псевдокоманды существуют и для разных случаев применения bset s, bclr s, brbs s,k, brbc s,k, и мн. др.

Способы адресации

Большинство команд ассемблера используют различные ячейки памяти микроконтроллера и, соответственно, содержат кроме кода операции (КОП) также их адреса. В зависимости от того в каком виде в команде хранится адрес различают два способа адресации: прямую и косвенную. В первом случае адрес ячейки задан явно, а во-втором он находится в одном из регистров-указателей (у AVR это 16-разрядные регистры X,Y,Z). У микропроцессоров различного типа, оба способа адресации могут иметь множество вариаций. Ниже приведены характерные только для микроконтроллеров AVR.

Разновидности прямой адресации

Прямая адресация регистра общего назначения

В команде присутствует адрес регистра приемника либо источника результата. Примерами команд могут служить inc Rd, dec Rd, lsl Rd, lsr Rd и т.д. Адресацию, где в команде кроме адреса регистра находится еще и константа (ldi  Rd,K, ori Rd,K  и т.д.), называют также непосредственной, а в случае сохранения/восстановления данных в стеке (push Rr и pop Rd) – стековой. Адрес РОН находится в пределах 0…31 (в командах с непосредственной адресацией 0…15).

Прямая адресация двух регистров общего назначения

Команды данного типа содержат адреса двух  РОН, один из которых является источником, а другой приемником результата в арифметических операциях, а также операциях пересылки. Примеры команд: mov Rd, Rr, add Rd, Rr, sub Rd, Rr, and Rd,Rr и т.д. Адреса обоих регистров лежат в пределах 0…31, но в некоторых командах умножения могут использоваться только РОНы 16…31 (muls Rd,Rr и fmuls Rd,Rr) или 16…23 (mulsu Rd,Rr и fmulsu Rd,Rr).

Прямая адресация регистра ввода-вывода

Прямую адресацию регистра ввода-вывода у AVR используют команды двух типов. Это копирование РВВ в РОН in Rd,P и пересылка в противоположном направлении out P,Rr. В обоих случаях могут быть использованы любые регистры общего назначения 0…31 и регистры ввода-вывода 0…64.

Прямая адресация ОЗУ

Прямая адресация ОЗУ встречается в командах lds Rd,k и sts k,Rr. Первая инструкция пересылает байта из SRAM микроконтроллера в один из РОНов, вторая копирует содержимое РОНа в ячейку SRAM. В обеих командах под поле адреса ячейки памяти отводится 16 битов, а значит, имеется возможность напрямую обращаться к любому адресу SRAM из диапазона 0…65535. Инструкции работают со всеми РОНами 0…31 и имеют размер в 2 слова (4 байта).

Разновидности косвенной адресации

Простая косвенная адресация

Простая косвенная адресация применяется для копирования данных из SRAM в РОН одной из команд ld Rd,X/Y/Z, а также для пересылки в обратном направлении  st X/Y/Z,Rr. В 2-байтовых регистрах-указателях X,Y,Z содержится адрес ячейки приемника либо источника в диапазоне 0…65535.

Косвенная адресация с преддекрементом

Этот вид адресации подобен простой косвенной адресации за исключением одного отличая. Перед выполнением операций пересылки значения индексных регистров X,Y,Z аппаратно уменьшается на единицу, что и символизирует знак “-” в командах ld Rd,-X/-Y/-Z и st -X/-Y/-Z,Rr.

Косвенная адресация с постинкрементом

При косвенная адресации с постинкрементом значения указателей X,Y,Z аппаратно увеличивается на единицу (знак “+” перед указателями) после пересылки байта командами ld Rd,X+/Y+/Z+ и st X+/Y+/Z+,Rr.

Относительная косвенная адресация

Относительная косвенная адресация также используется для пересылки данных между РОН и SRAM. Однако адрес ячейки памяти определяется здесь как сумма содержимого указателей Y,Z и фиксированного смещения q. Для пересылки байта из SRAM в РОН применяются команды ldd Rd,Y+q/Z+q, а для пересылки в обратном направлении st Y+q/Z+q,Rr. Величина q может лежать в пределах 0…63.

Перейти к следующей части:


Категория: Микроконтроллеры
Метки:

Написать коментарий

*
= 5 + 5

Добавить изображение

Последние статьи