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

Пока мы рассмотрим две категории команд.

Прямая адресация регистра данных

Данный способ адресации используют команды, в которых указывается адрес регистра данных, являющийся их операндом. Например, в команде movf h’25’,w операндом является регистр h’25’.

Из Рис. 3.5 видно, что 14-битный код команды состоит из трех частей:

• Шесть старших битов (13…8) называются кодом операции или, сокращенно, КОП. Каждая команда имеет уникальный КОП, и именно по его значению схема дешифратора определяет тип обрабатываемой команды.

• Седьмой бит кода команды, обозначенный символом «d», определяет адресата результата операции. Например, команда addwf h’30’,w означает «сложить содержимое рабочего регистра с регистром h’30’ и поместить результат обратно в рабочий регистр», тогда как команда addwf h’30’,f означает «сложить содержимое рабочего регистра с регистром данных h’30’ и поместить результат обратно в регистр h’30’». В первом случае адресатом операции является рабочий регистр W и бит d равен 0, а во втором случае адресатом является регистр данных и бит d равен 1. Мы еще вернемся к этой команде в пятой главе. В символической записи команды символы «,w» соответствуют сброшенному биту адресата d, а символы «,f» соответствуют установленному биту d.

• Младшие семь битов (6…0) определяют адрес регистра данных. Так, в нашем примере используется регистр h’25’, поэтому в указанном поле содержится значение Ь’0100101’. Так как размер поля адреса равен семи битам, то посредством прямой адресации можно адресовать только один банк памяти, вмещающий в себя 27 = 128 регистров, т. е. с регистра h’00’ по регистр h’7F’ (см. Рис. 4.7 на стр. 97).

Рис. 3.5. Формат кода команд, использующих прямую адресацию

Операции с константами

Команды, работающие с константами, кодируются немного иначе, как показано на Рис. 3.6. В старших шести битах по-прежнему содержится код операции, а в младших восьми битах находится собственно значение константы. Результат выполнения таких команд всегда помещается в рабочий регистр, поэтому не требуется ни бит адресата, ни значение адреса в памяти данных.

Рис. 3.6. Формат слова команд операций с константами

Код операции команды из нашего примера (addlw 04) равен Ь’111110’, а константа равна Ь’00000100’. Значение константы должно лежать в диапазоне Ь’00000000’…Ь’11111111’ (h’00’…h’FF’ или, в десятичной системе, 0…255), что вполне логично, поскольку рабочий регистр, как и все внутренние регистры исполнительного блока, является восьмибитным[49].

* * *

Не только команды могут иметь мнемонические обозначения. Как мы видели, символические имена можно присваивать и ячейкам памяти данных. Так, на Рис. 3.4 идентификатор NUM_1 используется для указания содержимого регистра данных h’25’, a NUM_2 — регистра данных h’26’. Таким образом, нашу программу можно символически записать следующим образом:

NUM_2 = NUM_1 + 4;

Возвращаясь к собственно компьютеру, мы видим, что, начиная с адреса h’000’, наша программа имеет вид

00100000100101

11111000000100

00000010100110

Если только вы не киборг, то чтение такой программы — весьма сомнительное удовольствие[50].

Если мы воспользуемся шестнадцатеричной системой[51], то будет уже удобнее:

0825

ЗЕ04

00А6

но ненамного. К тому же ЦПУ все равно понимает только двоичные числа, поэтому нам в любом случае понадобится программа-транслятор для перевода шестнадцатеричных значений в двоичные, запускаемая, скажем, на персональном компьютере.

Раз уж мы все равно собираемся использовать компьютер для перевода нашей программы, называемой также исходным кодом, в двоичный машинный код, называемый объектным кодом, то имеет смысл не мелочиться и записать ее полностью в символическом виде. При этом различные команды будут представлены их мнемоническими обозначениями, а адреса переменных — своими именами. В результате наша программа примет вид:

вернуться

49

Одна из наиболее распространенных ошибок заключается в упущении из виду этого 8-битного ограничения и в использовании в программе команд, подобных addlw h’500’. Результат этой операции аналогичен попытке заполнить литровую бутыль содержимым 4-литрового ведра!

вернуться

50

Мне ли этого не знать! Я писал программы подобным образом в середине 70-х.

вернуться

51

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