Микроконтроллеры 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…63.
Прямая адресация ОЗУ
Прямая адресация ОЗУ встречается в командах 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.
Перейти к следующей части: Арифметические и логические команды
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
В моем случае смещение возможно было бы применить в пределах 0...127 или даже 0.....256! Размер SRAM позволяет. В моем даташите такое же ограничение 0...63 и нет объяснения почему. У меня закрадывается смутное предположение что смещение может иметь как положительное значение, так и отрицательное.
Команда
10q0 qq0d dddd 1qqq
q - это биты числа q (смещения). Их здесь 6 штук. Максимальное число записанное на 6 битах - это 63 (0011 1111)