Набор инструкций ядра PIC24F значительно расширен по сравнению с набором инструкций микроконтроллеров PIC18. Так как величина слова инструкции PIC24F составляет 24 бита, увеличено как количество инструкций, так и методов адресации и поддерживаемых типов данных (двойное слово данных – 32 бита, слово данных – 16 бит, байт). Основные различия в наборах инструкций PIС18 и PIC24F приведены в таблице:
Параметры | PIC18 | PIC24F |
---|---|---|
Величина слова инструкции | 16 бит | 24 бита |
Количество базовых инструкций | 75 | 76 |
Поддерживаемая разрядность данных | Байт | Байт, слово, двойное слово |
Количество операндов | До двух (b = a + b) | До трех (c = a + b) |
Режимы адресаций | Прямая, косвенная (5 видов) | Прямая, косвенная (6 видов) |
Косвенная адресация | Используются регистры косвенной адресации FSR – максимум три указателя | Как указатель используется любой регистр общего назначения – до 16 указателей |
Адресация памяти данных | Прямая адресация – ограничено текущим банком. Вся память данных адресуется за несколько инструкций | Прямая адресация – ограничено областью ближней памяти 1). Вся память данных – косвенная адресация |
Набор инструкций ядра PIC24F предоставляет пользователю дополнительные возможности, увеличивающие скорость выполнения математических алгоритмов и обеспечивающие улучшенную поддержку языков программирования высокого уровня. Последнее связно с гибкой работой с указателями и использованием программного стека:
Инструкции ядра PIC24F | Описание |
---|---|
DIV | Деление двух чисел, знаковое и беззнаковое, 32 бита на 16 бит и 16 бит на 16 бит |
LNK , ULNK | Фиксировать и освободить указатель стекового фрейма (W14 ) |
LSR , ASR | Двоичный и арифметический сдвиг вправо (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная |
MUL.SS , MUL.SU , MUL.UU | Умножение (знаковое, смешанное, беззнаковое) |
PUSH , POP | Обе инструкции имеют произвольный аргумент, что позволяет сохранять в стеке значение, отличное от текущего значения счетчика команд |
REPEAT | Повтор следующей инструкции определенное количество раз |
SL | Сдвиг влево (от 1 до 15 бит). Аргументом, определяющим величину сдвига, может являться константа или переменная |
Однако некоторые инструкции ядра PIC18 не могут быть заменены атомарной инструкцией ядра PIC24F. Как правило, аналогичный (но не идентичный, вследствие различия флагов в STATUS
регистре) результат можно получить, используя одну или две инструкции PIC24F. К таким инструкциям ядра PIC18 относятся:
CPFSEQ
, CPFSGT
, CPFSLT
, MOVSF
, MOVSS
, INFSNZ
, DCFSNZ
, DECFSZ
, SUBULNK
, INCFSZ
, TSTFSZ
, PUSHL
, MOVFF
(все режимы исключая перемещение с использованием косвенной адресации источника и приемника), SWAPF
(все режимы за исключением использования с WREG
)
За исключением перечисленных выше, все инструкции PIC18 имеют аналоги в наборе инструкций PIC24F. Более подробная информация приведена в приложении А..
Кроме бит-ориентированных инструкций, инструкции ядра PIC18 поддерживают только работу с данными величиной 1 байт. Любые действия с данными разрядностью более 8 бит требуют корректной последовательности выполнения нескольких инструкций.
Ядро PIC24F имеет 16-битную шину данных, что определяет основной формат операндов как 16-битное слово (2 байта). Помимо этого большинство инструкций могут прозрачно использовать 8-битные и 32-битные операнды. При использовании ассемблера суффикс мнемоники .b
указывает, что операция производится с 8-битными данными, а суффикс .d
– что операция производится с двойным 32-битным словом. Выравнивание, определяемое разрядностью операнда производиться автоматически.
В набор инструкций PIC18 входят команды, поддерживающие только унарные и бинарные операции. Унарная операция подразумевает, что результат сохраняется непосредственно в операнд (например, инкремент регистра WREG
). Бинарная операция позволяет производить действия с двумя операндами (например, сложение) с последующим сохранением результата в один из операндов.
Набор инструкций PIC24F кроме унарных и бинарных операций поддерживает команды с тремя операндами. При этом результат операции с двумя операндами сохраняется в третий. Операции с тремя операндами могут выполнять большинство математических инструкций и инструкций сдвига.
Основное отличие в системах команд PIC18 и PIC24F заключается в количестве способов адресации данных и реализации этих способов. PIC18 и PIC24F поддерживают одни и те же методы адресаций (за исключением отсутствия в PIC18 косвенной адресации с пре-декрементом).
Архитектура PIC18 позволяет адресовать любой байт из памяти данных. Однако так как для прямой адресации в большинстве инструкций в качестве операнда используется 8-битная константа, память данных PIC18 условно разделена на 16 банков. Текущий банк определяется значением служебного регистра BSR
.
Набор инструкций PIC24F разработан таким образом, чтобы любая команда, использующая прямую адресацию, имела доступ к первым 8 кБ памяти данных (NDS - Near Data Space: 0x0000
– 0x1FFF
), то есть для прямой адресации используется 13-битная константа. Это позволяет использовать прямую адресацию регистров специального назначения (которые все расположены в NDS). Память данных, расположенная выше NDS (адреса, превышающие 0x1FFF
) адресуется косвенно.
В ядре PIC18 для косвенной адресации используется набор регистров специального назначения (указателей) и набор виртуальных регистров. При этом в три указателя FSR0
, FSR1
и FSR2
может быть загружена 12-битная константа. Для выполнения косвенной адресации, в качестве операнда используется один из виртуальных регистров. В зависимости от того, какой из виртуальных регистров является операндом, может быть выполнена дополнительная операция над указателем, например инкремент или декремент. Таким образом, только три указателя и соответствующие им виртуальные регистры могут быть использованы для косвенной адресации.
В PIC24F в качестве указателя может использоваться любой из 16-и регистров общего назначения W0
-W15
. Ассемблер предусматривает специальный синтаксис записи косвенной адресации, в том числе и операции над указателем (адресация со смещением, инкремент и декремент указателя). Помимо пре-инкремента, пре-декремента, пост-инкремента указателя, возможен пре-декремент, недоступный в архитектуре PIC18.
Следует заметить, что при использовании косвенной адресации с изменением указателя, для байтовых инструкций указатель будет изменен на 1. Для инструкций, оперирующих со словом, указатель будет изменен на 2, что обеспечивает корректное выравнивание указателя.
Сравнение режимов косвенной адресации и их реализации приведены в таблице:
Косвенная адресация | Виртуальный регистр PIC18, используемый в качестве операнда | Синтаксис ассемблера PIC24F | Изменение Wn или FSR после байтовой инструкции | Изменение Wn или FSR после инструкции работы со словом |
---|---|---|---|---|
Без модификации | INDFx | [Wn] | Wn = Wn | Wn = Wn |
С пре-инкрементом | PREINCx | [++Wn] | Wn = Wn + 1 | Wn = Wn + 2 |
С пре-декрементом | - | [–Wn] | Wn = Wn - 1 | Wn = Wn – 2 |
С пост-инкрементом | POSTINCx | [Wn++] | Wn = Wn + 1 | Wn = Wn + 2 |
С пост-декрементом | POSTDECx | [Wn–] | Wn = Wn - 1 | Wn = Wn – 2 |
Со смещением | PLUSWx | [Wn + Wb] | Wn = Wn | Wn = Wn |
Типовая операция копирования массивов для семейства PIC18:
LoopSetup MOVLW 0x10, LoopCount ;set up loop counter LFSR 0, myArray0 ;set up pointer 0 LFSR 1, myArray1 ;set up pointer 1 CopyLoop MOVFF POSTINC0, POSTINC1 ;copy myArray1 to myArray0 DECFSZ LoopCount, F ;decrement loop counter BRA CopyLoop
Типовая операция копирования массивов для семейства PIC24F:
LoopSetup MOV #myArray0, W0 ;set up pointer 0 MOV #myArray1, W1 ;set up pointer 1 REPEAT #15 ;loop 16 times MOV [W1++], [W0++] ;copy array1 to array
Расширенные возможности косвенной адресации в архитектуре PIC24F в некоторых случаях могут привести к нарушению последовательности «чтение-модификация-запись». Нарушения возникают в том случае, когда переменная, необходимая для выполнения инструкции, выборка которой происходит в данный момент, еще не изменена.
В общем случае это происходит тогда, когда сразу за инструкцией, изменяющей регистр общего назначения, следует инструкция, использующая этот регистр как указатель. Ядро PIC24F предусматривает такую опасность, и автоматически выполняет одну или более пустых инструкций (NOP
) до момента завершения операции изменения указателя:
Метод адресации первой инструкции | Метод адресации второй инструкции | Количество пустых командных тактов 2) | Пример (Wn = W2 ) |
---|---|---|---|
Прямая | Прямая | 0 | ADD.w W0, W1, W2 MOV.w W2, W3 |
Косвенная | Прямая | 0 | ADD.w W0, W1, [W2] MOV.w W2, W3 |
Косвенная | Косвенная | 0 | ADD.w W0, W1, [W2] MOV.w [W2], W3 |
Косвенная | Косвенная, с модификацией указателя | 0 | ADD.w W0, W1, [W2] MOV.w [W2++], W3 |
Косвенная, с модификацией указателя | Прямая | 0 | ADD.w W0, W1, [W2++] MOV.w W2, W3 |
Прямая | Косвенная | 1 | ADD.w W0, W1, W2 MOV.w [W2], W3 |
Прямая | Косвенная с модификацией указателя | 1 | ADD.w W0, W1, W2 MOV.w [W2++], W3 |
Косвенная | Косвенная | 1 | ADD.w W0, W1, [W2] MOV.w [W2], W3 ; W2=04h (mapped W2) |
Косвенная | Косвенная с модификацией указателя | 1 | ADD.w W0, W1, [W2] MOV.w [W2++], W3 ; W2=04h (mapped W2) |
Косвенная с модификацией указателя | Косвенная | 1 | ADD.w W0, W1, [W2++] MOV.w [W2], W3 |
Косвенная с модификацией указателя | Косвенная с модификацией указателя | 1 | ADD.w W0, W1, [W2++] MOV.w [W2++], W3 |