Программирование PIC: перемещение литерала в файл? - PullRequest
0 голосов
/ 30 мая 2018

В настоящее время я изучаю PIC, и мы использовали такие команды, как MOVLW (переместить литерал в регистр записи), MOVWF (переместить регистр записи в указанное местоположение файла) и т. Д., Но мне любопытно, почему нет командычто позволяет вам MOVLF или перемещать литерал непосредственно в регистр файлов?Это пропустит шаг использования регистра записи и займет всего 1 цикл инструкций вместо 2.

Спасибо за помощь

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Техническая причина, по которой на 8-битном PICmcu нет инструкции movlf, связана с шириной инструкции.В командном слове 14 битов.Эти биты должны быть выделены для кода операции и полезной нагрузки.Ширина кода операции для PIC16 не является фиксированным количеством битов.В некоторых инструкциях, таких как CALL и GOTO, есть 3-битные коды операций, позволяющие работать с 2KB без посторонней помощи.Другие инструкции, такие как ВСЕ литеральные инструкции, нуждаются в 8-битной полезной нагрузке (для литералов), поэтому у них осталось только 6 битов ... но подождите, файловые инструкции нуждаются в 7 битах (на PIC16) для адресации файловых регистров, поэтому мыдолжен украсть один бит буквенных кодов операций, чтобы создать сегмент адреса файла.Мы также должны украсть один бит буквенных кодов операций для создания ВСЕХ ДРУГИХ кодов операций ..... В любом случае карта инструкций быстро заполняется, поэтому вам приходится выбирать между инструкциями.В случае предложенной вами инструкции ... movlf, для этого потребуется 7 бит адреса файла и 8 бит литерального адреса, а также много битов кода операции, чтобы найти место в ISA.Просто полезная нагрузка составляет 15 бит.PIC18 решает эту проблему, выполняя некоторые 2-тактные инструкции.Они выглядят как одна инструкция, но занимают 2 слова в памяти программы и требуют 2 тактов ЦП для выполнения.Примером является MOVFF.Разработчики PIC16 решили, что, поскольку потребовалось 2 слова и 2 цикла, не было никаких потерь в том, чтобы сделать 2 инструкции явными.Это на самом деле является преимуществом, потому что 2 инструкции цикла на PIC18 добавляют 1 цикл неопределенности к задержке прерывания.

0 голосов
/ 31 мая 2018

В ядре PIC один операнд всегда должен быть w-регистром.Но вы можете помочь себе с помощью макроса:

MOVLF   macro   LITERAL, Register
        MOVLW   LITERAL
        MOVWF   Register
        endm

Но знайте, конечно, что вам нужно два цикла для этой «команды».

0 голосов
/ 31 мая 2018

Существует два 8-битных семейства PIC и наборы команд, PIC16 и PIC18 (и даже PIC12)!

Помните, что это RISC (сокращенный набор инструкций).

Одна инструкция PIC16 имеет ширину 14 бит, а у PIC18 - 16 бит!Итак, как вы можете видеть, вы не можете поместить 8-битный адрес и 8-битный литерал в одно вторжение.Однако PIC16 имеет инструкцию clrf, которая помещает 0 в регистр файла, а PIC18 также имеет инструкцию setf, которая помещает 255 в регистр файла.У вас также есть инструкция movlb, которая помещает 5 или 4-битный литерал в BSR регистр файла, чтобы уменьшить ваш код при выборе банка памяти размером 256 байт.

Есть также еще две отдельные инструкции, которые могут вам помочь, bsf и bcf (в PIC18 также btg), но они могут устанавливать / очищать только один бит в регистре файлов (или также переключаться).один бит в PIC18).

0 голосов
/ 30 мая 2018

Нередко редкие операции существуют только с регистром source / dest, а не сразу.

Например, x86 для перемещения в сегментный регистр имеет только регистр / источник памяти, но очень частоиспользуется с mov ax, @data (mov r16, imm16) / mov ds, ax (один раз в начале небольших программ или загрузочных секторов).

Наличие отдельного кода операции для другой формы израсходует ограниченное пространство кода, уменьшаяколичество различных инструкций, которые вы можете использовать.Или это сделало бы декодеры более сложными.

Это раздражает, когда ваш сценарий использования требует много чего-то, что, как решили дизайнеры ISA, было недостаточно важным для одной инструкции.: /

...