Пример использования выражений языка программирования ASM-51 для определения числовой константы приведен в листинге 8.3.

Часто операнд используется для представления символов на экране дисплея. В этом случае для определения его значения удобнее воспользоваться не числом, а литеральной константой.
Литеральная константа заключается в апострофы:
'a', 'W'
mov SBUF, #'Б' ;Передать по последовательному порту ANSI код буквы 'Б'
Часто на экране дисплея приходится отображать не одну букву, а целые фразы. Их удобно запоминать в памяти программ, а затем передавать на дисплей при помощи специальной подпрограммы. Для записи фраз в памяти программ можно воспользоваться литеральными строками, для ввода которых в память программ удобно воспользоваться директивой db:
Nadp: DB 'Ошибка в блоке 5'
В этом случае каждый символ строки заменяется отдельным байтом и запоминается в ПЗУ памяти программ. Начало строки обязательно помечается при помощи метки. Для увеличения наглядности программы следует содержание надписи отобразить в имени использованной метки.
Директивы языка программирования ASM-51
Любой ассемблер всегда включает в себя команды микроконтроллера, но ими не ограничивается набор операторов этого языка программирования. Дело в том, что нужно уметь управлять самим процессом трансляции программы.
Первое, чем приходится по необходимости заниматься, если в программе используются только команды микроконтроллера, - это вручную распределять память данных микроконтроллера. При таком распределении приходится помнить, какой вид данных находится в каждой конкретной ячейке памяти, и указывать значение адреса памяти в качестве операнда команд. При необходимости изменить местоположение данных в ячейках памяти приходится просматривать всю программу и изменять соответствующие команды.
При чтении программы трудно отличить константы от переменных, ведь в командах они отличаются только видом адресации. Это приводит к увеличению времени написания программы, т. к. каждый раз приходится решать загадку: что же подразумевалось под конкретной цифрой - переменная, константа или маска?
Преодолеть эту трудность можно при помощи идентификаторов. Можно назначить какой-либо ячейке памяти идентификатор и работать с ним, как с переменной. Более того! При необходимости изменить адрес переменной в памяти данных можно просто изменить значение идентификатора, а не просматривать всю программу, каждый раз решая, является ли найденное число адресом переменной, маской или константой!
Директива equ позволяет назначать имена для констант и значения адресов для переменных. При использовании этой директивы можно назначить идентификатору переменной адрес в одном месте программы и пользоваться идентификатором этой переменной во всей программе. Правда, за использование идентификатора именно в качестве переменной отвечает программист. Если он попытается использовать адрес переменной как константу, то транслятор не выдаст никакого сообщения об ошибке. Он спокойно оттранслирует оператор. При использовании назначения адресов переменных при помощи директивы equ изменение адреса при необходимости можно сделать в одном месте программы, а не просматривать всю программу, судорожно пытаясь вспомнить, где же еще была использована эта ячейка памяти. Все необходимые изменения в машинном коде программы сделает сам транслятор!
Пример назначения имен переменных с использованием директивы equ приведен в листинге 8.4.

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

В этом примере использована подпрограмма-функция, перекодирующая двоично-десятичное число в семисегментный код при помощи таблицы TabDecod. В эту функцию двоично-десятичный код передается через аккумулятор и через этот же регистр в вызывающую программу возвращается семисегментный код.
В директиве db можно задавать сразу несколько констант, разделенных запятыми. Можно одновременно использовать все системы счисления, но обычно имеет смысл снабдить каждую константу комментарием, как это сделано в предыдущем примере. Так программа становится более понятной и ее легче отлаживать.
Эта же директива позволяет легко размещать в памяти строки, которые в дальнейшем потребуется высвечивать на встроенном дисплее или экране дисплея универсального компьютера, подключенного к разрабатываемому устройству через какой-либо интерфейс. Пример использования директивы db для занесения строк в память программ микроконтроллера приведен а листинге 8.6.

Директива dw позволяет заносить в память программ двухбайтные числа. В ней, как и в директиве db, можно записывать несколько чисел, разделенных запятой. Пример фрагмента программы приведен в листинге 8.7.

В листинге 8.7 фрагмент программы приведен для того, чтобы можно было проследить, какие байты заносятся в память программ микроконтроллера. В самой правой колонке листинга приведены адреса, в которые будут занесены числа, являющиеся операндами директивы dw. В следующей колонке приведены двухбайтовые числа, которые будут заноситься в память программ микроконтроллера. Обратите внимание: несмотря на то, что первые два операнда директивы dw состоят только из одной цифры, в память микроконтроллера заносятся четыре теричных цифры (двухбайтовое число).
При трансляции исходного текста программ по умолчанию предполагается, что первая команда расположена по нулевому адресу. Адрес последующих команд зависит от длины и количества предыдущих команд. Пример начального участка программы приведен в листинге 8.8.