Выбрать главу

• Научитесь выполнять сравнение данных и их проверку на определенное значение с выполнением требуемых действий в зависимости от результата.

• Узнаете, что данные в памяти данных можно циклически сдвигать через флаг переноса С.

• Научитесь использовать четыре базовых логических операции для того, чтобы выполнять инвертирование, установку, сброс, смену значения, проверку состояния битов и сличение данных.

• Поймете, как можно управлять ходом программы в зависимости от состояния любого бита или нулевого значения в регистре данных.

Подавляющее большинство команд оперирует данными, находящимися либо во внутренних регистрах ЦПУ, либо вне его (в памяти данных или памяти программ). Так что в 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], где квадратные скобки означают «содержимое», а стрелка — «становится». Такой тип нотации называется языком регистровых передач (Register Transfer Language — RTL).

Разумеется, эта команда не является трехоперандной в полном смысле этого слова, поскольку в качестве адресата может использоваться только один из источников, т. е. либо рабочий регистр, либо регистр данных. В некоторых командах указывается только один операнд-адресат, например clrf h’20’, a y команд с самоадресацией вообще нет явных операндов.

Все команды можно разделить по используемому способу адресации.

Адресация кодом команды

Такие команды, как clrwdt (сброс сторожевого таймера), retfie (возврат из прерывания), nop (нет операции), return (возврат из подпрограммы) и sleep (переход в «спящий» режим), не используют операнды из памяти. У всех этих команд в старших семи битах слова команды присутствуют нули. Например, команда clrwdt имеет машинный код Ь’00000000000100’.

Адресация константы

В командах, работающих с константами, младшие 8 бит кода команды используются для указания операнда-источника, являющегося в данном случае константой, а не байтом в регистре данных. Например, команда addlw 06 кодируется как b’11111000000110’. Операндом-адресатом в командах такого типа всегда является рабочий регистр, что и отражено в мнемоническом обозначении. Так, в нашем примере сумма W + 6 копируется обратно в рабочий регистр W. На языке регистровых передач эта операция выражается как W <- W + #6, где символ «#» (диез, или решетка) указывает, что стоящее после него число является константой, а не адресом регистра данных.

В некоторых процессорах такая разновидность адресации называется непосредственной, поскольку значение данных доступно непосредственно, без обращения к памяти.

Абсолютная адресация памяти программ

В микроконтроллерах PIC предусмотрены две команды, которые позволяют программе перейти к другой команде, находящейся в любом месте памяти программ. Этими командами являются команды goto и call (вызов подпрограммы, см. главу 6). В микроконтроллерах с 14-битным ядром под этот адрес[80] в коде команды выделяется 11 бит. Так что машинный код команды goto h’400’ будет равен Ь’10110000000000’. Аналогично call h’530’ — b’10010100110000’.

вернуться

80

Не путайте этот адрес с адресом регистра из памяти данных. В гарвардской архитектуре эти две области памяти физически разделены и находятся и различных адресных пространствах.