~~NOTOC~~ ====== Набор инструкций ====== Набор инструкций ядра 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 указателей | | Адресация памяти данных | Прямая адресация – ограничено текущим банком. Вся память данных адресуется за несколько инструкций | Прямая адресация – ограничено областью ближней памяти ((Near Data Space – 8 кБайт)). Вся память данных – косвенная адресация | ===== Изменение набора инструкций PIC24F по сравнению с PIC18 ===== Набор инструкций ядра 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. Более подробная информация приведена в [[articles:mchp:pic18_to_pic24_migration:addon_a|приложении А.]]. ===== Поддерживаемые типы данных ===== Кроме бит-ориентированных инструкций, инструкции ядра 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'') до момента завершения операции изменения указателя: ^ Метод адресации первой инструкции ^ Метод адресации второй инструкции ^ Количество пустых командных тактов ((выполняемых ядром после первой инструкции)) ^ Пример (''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 | \\ \\ ---- [[ articles:mchp:pic18_to_pic24_migration:contents|К содержанию]]