При чтении программы трудно отличить константы от переменных, ведь в командах они отличаются только видом адресации. Это приводит к увеличению времени написания программы, т. к. каждый раз приходится решать загадку: что же подразумевалось под конкретной цифрой — переменная, константа или маска?
Преодолеть эту трудность можно при помощи идентификаторов. Можно назначить какой-либо ячейке памяти идентификатор и работать с ним, как с переменной. Более того! При необходимости изменить адрес переменной в памяти данных можно просто изменить значение идентификатора, а не просматривать всю программу, каждый раз решая, является ли найденное число адресом переменной, маской или константой!
Пример назначения имен переменных с использованием директивы equ приведен в листинге 8.4.
Как видно из приведенного примера, использование идентификаторов значительно повышает наглядность программы, т. к. в них отражается назначение соответствующих констант и переменных.
При помощи директивы equ можно назначать не только переменные, но и константы. Как уже говорилось ранее, будет ли использован идентификатор как переменная или как константа, зависит от команд и видов адресации, которые использует программист. И даже если адрес переменной и константа будут обладать одинаковым числовым значением, то лучше им назначить разные имена.
В приведенном в листинге 8.4 примере имена Funcset и _8bit являются константами, но это становится понятным только по использованию непосредственной адресации в команде mov.
Один раз назначенный при помощи директивы equ идентификатор уже не может быть изменен, и при повторной попытке назначения точно такого же имени идентификатора транслятором будет выдано сообщение об ошибке.
Константы, назначаемые директивами equ или set, могут быть использованы только в качестве операндов команд микроконтроллера. В то же время достаточно часто требуется работа с таблицей констант, такой как таблица перекодировки, таблицы элементарных функций или синдромы помехоустойчивых кодов. Такие константы используются не на этапе трансляции для формирования машинного кода инструкций, а при исполнении программы. Они заносятся в память программ микроконтроллера. Для помещения значений констант в память программ микроконтроллера используются директивы db и dw.
В этом примере использована подпрограмма-функция, перекодирующая двоично-десятичное число в семисегментный код при помощи таблицы TabDecod. В эту функцию двоично-десятичный код передается через аккумулятор и через этот же регистр в вызывающую программу возвращается семисегментный код.
В директиве db можно задавать сразу несколько констант, разделенных запятыми. Можно одновременно использовать все системы счисления, но обычно имеет смысл снабдить каждую константу комментарием, как это сделано в предыдущем примере. Так программа становится более понятной и ее легче отлаживать.
Эта же директива позволяет легко размещать в памяти строки, которые в дальнейшем потребуется высвечивать на встроенном дисплее или экране дисплея универсального компьютера, подключенного к разрабатываемому устройству через какой-либо интерфейс. Пример использования директивы db для занесения строк в память программ микроконтроллера приведен а листинге 8.6.