• Узнаете, что данные в памяти данных можно циклически сдвигать через флаг переноса С
.• Научитесь использовать четыре базовых логических операции для того, чтобы выполнять инвертирование, установку, сброс, смену значения, проверку состояния битов и сличение данных.
• Поймете, как можно управлять ходом программы в зависимости от состояния любого бита или нулевого значения в регистре данных.
Подавляющее большинство команд оперирует данными, находящимися либо во внутренних регистрах ЦПУ, либо вне его (в памяти данных или памяти программ). Так что в 14-битном слове команды должно быть поле, информирующее дешифратор команд о том, где расположены эти данные. Исключение из указанного правила составляют несколько команд с адресацией кодом самой команды, такие как nop
(нет операции) и return (возврат из подпрограммы). Прежде чем перейти к изучению собственно команд, мы рассмотрим различные методы, используемые для указания местоположения любых операндов.В общем случае все команды записываются следующим образом:
мнемоника
<операнд А>,<операнд В>где операнд-А — исходные данные или их местоположение, а операнд В — адресат команды. Например, команда movf h’20’,w
(копировать регистр данных) копирует содержимое источника (регистр h’20’) в приемник (рабочий регистр).Существует несколько вариантов такой записи. Наиболее часто встречаются команды с 2.5 операндами. Например, команда addwf [регистр], d
прибавляет содержимое рабочего регистра W к содержимому указанного регистра данных и помещает результат либо в W, либо обратно в регистр данных. Так, команда addwf h’20’, w означает «прибавить содержимое W к содержимому регистра h’20’ и записать результат в регистр h’20’». Коротко это можно записать как [f20] <- W + [f20], где квадратные скобки означают «содержимое», а стрелка — «становится». Такой тип нотации называетсяРазумеется, эта команда не является трехоперандной в полном смысле этого слова, поскольку в качестве адресата может использоваться только один из источников, т. е. либо рабочий регистр, либо регистр данных. В некоторых командах указывается только один операнд-адресат, например clrf h’20’
, a y команд с самоадресацией вообще нет явных операндов.Все команды можно разделить по используемому способу адресации.
Такие команды, как clrwdt
(сброс сторожевого таймера), retfie (возврат из прерывания), nop (нет операции), return (возврат из подпрограммы) и sleep (переход в «спящий» режим), не используют операнды из памяти. У всех этих команд в старших семи битах слова команды присутствуют нули. Например, команда clrwdt имеет машинный код Ь’В командах, работающих с константами, младшие 8 бит кода команды используются для указания операнда-источника, являющегося в данном случае константой
, а не байтом в регистре данных. Например, команда addlw 06 кодируется как b’В некоторых процессорах такая разновидность адресации называется непосредственной, поскольку значение данных доступно непосредственно, без обращения к памяти.
В микроконтроллерах PIC предусмотрены две команды, которые позволяют программе перейти к другой команде, находящейся в любом месте памяти программ. Этими командами являются команды goto
и call (вызов подпрограммы, см. главу 6). В микроконтроллерах с 14-битным ядром под этот адрес[80] в коде команды выделяется 11 бит. Так что машинный код команды goto h’400’ будет равен Ь’Используя этот 11-битный адрес, можно непосредственно адресовать любую команду в памяти программ объемом до 211
= 2 Кбайт. Однако в микроконтроллерах среднего уровня реализован 13-битный счетчик, который может адресовать память данных объемом до 8 Кбайт (память такого объема имеется, например, в модели PIC16F877). Для разрешения этой ситуации при выполнении команд goto и call абсолютный 11-битный адрес объединяется с битами 4:3 регистра защелки PCLATH, формируя таким образом полный 13-битный адрес, загружаемый в счетчик команд. Этот процесс показан на Рис. 5.1 (см. также Рис. 4.8 на стр. 103).