READ_ME.ASM
UniASM версия 2.03
14 сентября 1989
Настощий файл содержит важную инфор-
мацию о версии 2.03 ассемблера UniASM.
Возможно, часть информации уже включена
в Вашем руководстве.
В дистрибутивном пакете находится
также программа UASM.COM предназначенная
для выполненя на компьютере типа IBM-PC
и пред- ставляющая собой кросс-компиля-
тор языка ассемблера для микрокомпьютера
"Пылдин 601 / 601А".
В настоящем файле записано содер-
жание новых глав и абзацов Руководства.
Соблюдена новая нумерация частей текста.
Надеемся, что актуализация Руководства
не затруднит Вас.
СОДЕРЖАНИЕ НОВОЙ РЕДАКЦИИ РУКОВОДСТВА
стр.
1. Введение 5
2. Файлы ассемблера 6
3. Вызов ассемблера 7
4. Формат исходного текста 8
4.1. Поле метки 8
4.2. Поле операции 9
4.3. Поле операнда 10
4.4. Поле комментария 10
5. Формат выходного листинга 11
6. Синтаксические категории
асемблера 12
6.1. Символ 12
6.2. Локальный символ 12
6.3. Константа 14
6.4. Выражение 14
6.5. Список 15
7. Относительный и абсолютный тип 16
7.1. Тип программной секции 16
7.2. Тип символа 16
7.3. Тип выражения 17
8. Адресация микропроцессора CМ 601 18
9. Директивы ассемблера 19
9.1. Директива присвоения 19
9.2. Директивы управления
трансляцией 19
9.3. Директивы управления
листингом 21
9.4. Директивы определения
данных 22
10. Диагностические сообщения
транслятора 24
A. Команды микропроцессора СМ 601 27
2. ФАЙЛЫ АССЕМБЛЕРА
UniASM работает с файлами трех видов
- входной (исходный) файл, содержа-
щий программу на языке ассемблера в ис-
ходном виде. Входной файл в терминах
операционной системы является текстовым
файлом. Может иметь любые допустимые
системой имя и расширение имени.
- выходной (объектный) файл, содер-
жащий программу в объектном коде - тран-
слированную программу. Объектный файл
становится исполнимым после его обра-
ботки связывающим редактором UniLINK
операционной системы или программой
OBJ2PGM, которая входит в состав дис-
трибутивного пакета;
- файл протокола (листинга) тран-
сляции - необязательный файл, в котором
сопоставлены исходные инструкции и гене-
рированные им со- ответствующие машинные
коды, а также сообщения об обнаруженных
во время трансляции ошибках. Необходи-
мость создания файла листинга определя-
ется во время вызова транслятора вводом
параметра /l . Файл листинга может
иметь любое допустимое операционной
системой полное имя.
3. ВЫЗОВ АССЕМБЛЕРА
Вызов транслятора UniASM на выпол-
нение осуществляется командой операцион-
ной системы:
UASM [/l] <source> [output].
ASM < имя1 > <имя2 >
Параметр source представляет собой
имя исходного файла. Применимо любое
допустимое операционной системой имя.
Если не указано расширение имени, то по
умалчанию принимается расширение .601.
Если полное имя файла состоит только из
основного имени (без расширения) то ввод
имени заканчивается точкой. Файл с име-
нем, указанном в source, должен суще-
ствовать. В противном случае выдается
сообщение об ошибке.
Параметр output представляет собой
имя выходного файла, содержащего (в за-
висимости от наличия или отсутствия па-
раметра /l) объектный код программы или
листинг ассемблирования. Применимо лю-
бое допустимое операционной системой
имя. Если не указано расширение имени,
то по умалчанию принимается расширение
.OBJ или .LST. Если полное имя файла
состоит только из основного имени (без
точкой. Если существует файл с задан-
ным именем, то его старое содержание те-
ряется. В качестве параметра нельзя
указать имя стандартного устройства
операционной системы.
Если параметр не введен, имя соот-
ветствующего выходного файла по умолча-
нию формируется из основного имени ис-
ходного файла с расширением .OBJ или
.LST.
Ввод параметра /l приводит к тому,
что выходной файл содержит листинг ас-
семблирования. В противном случае вы-
ходной файл содер- жит объектный код
программы. Генерирование одновременно
объектного кода и листинга НЕВОЗМОЖНО.
ПРИМЕРЫ :
1\ asm samplei - вызов траслятора для
обработки файла без
генерации файла лис-
тинга
2\ asm samplei samplei.lst - вызов
транслятора для обра-
ботки файла с генера-
цией файла листинга
3\ asm sampli prn - вызов транслятора
для обработки файла
с прямым выводом файла
листинга на печать
4. Формат входного файла.
Программа на языке Ассемблер обраба-
тывается построчно. Длина строки дол-
жна быть не более 255 символов.В одной
строке должна быть записана только одна
инструкция.
Каждая строка сотоит из 4 полей :
[метка] <операция> [операнд] [коммент.]
Соседние поля разделяются одним или
более пробелами или табуляциями. В фай-
ле листинга поля разделяются одной та-
буляцией.
4.2. Поле операции
Кроме стандартных для процессора СМ
601 мнемонических обозначениях, допусти-
мы и следующие мнемоники (в скобках ука-
заны соответствующие им стандартные мне-
моники).
BHS (BCC)
BLO (BCS)
LSL (ASL)
LSLA (ASLA)
LSLB (ASLB)
В строке программы поле операции следует
за полем метки.Если поле метки отсутст-
вует, то перед полем операции должен быть
введен хотя бы один пробел или табуляция.
Поле операции может содержать мнемони-
ческое обозначение машинной команды или
инструкцию транслятора.
Если в поле операции записана команда,
то транслятор генерирует соответствующий
ей машинный код.Если записана дериктива
- она выполняется.
Все дериктивы описаны ниже, а мнемони-
ческие обозначения всех машинных команд
процессора СМ 601 даны в прил.А.
В поле операции может быть записана ко-
манда INT xx вызова определенной специ-
альной функции операционной системы
UNIDOS INT xx ( xx- 16-ное число номера
функции).
Все функции INT xx описаны в документе
" UNIBIOS- Руководство пользовотеля".
4.3 Поле операнда.
Содержание поля операнда определяется
операцией.Операнд указывает объект дей-
ствия команды.
Если команда двухоперандная, то первый
операнд записывается как часть мнемони-
ки команды. Например, для команды ADD
можно записать ADDA или ADDB в зависи-
мости от того, над каким регистром вы-
полняется операция.
В качестве операнда могут быть записаны:
адрес; вычисляемое выражение или строка
символов.
4.4 Поле комментариев.
Первым символов поля комментария являет-
ся символ ";".
5. Формат листинга трансляции.
На каждой строке листинга трансляции
последовательно выводится :
- адрес строки;
- машинный код, записанный по
этому адресу.Если код длиннее 3 байтов,
то каждые 3 байта выводятся на следу-
ющей строке;
- номер соответствующей строки
исходного файла;
- содержание соответствующей
строки исходного файла.
Если при обработке некоторой строки
исходного файла обнаружена ошибка, то
сообщение об этом выводится на следу-
ющей строке листинга.
В конце листинга выводится таблица оп-
ределенных символов программы и их зна-
чения. Символы, оставшиеся без примене-
ния обозначены знаком "?".
6. Синтаксические категории
Ассемблера.
6.1 Символ.
Символом языка Ассемблера называется
определенное в программе имя, значением
которого является целое 16-ное число
без знака. Символ дефинируется меткой или
специальной директивой присваивания "=".
Каждый символ может быть определен толь-
ко один раз.
Напомним, что транслятор Ассемблера не
отличает прописные от строчных букв в
именах. Например, loop, LOOP, LooP
интерпритируются как один символ.
Символ должен начинаться латинской буквой
и может включать буквы, цифры и знак "_".
Длина символа ограничена длиной строки,
но учитываются только первые 8 (графи-
ческих) символа. Например, символы
abcdefgh111 и abcdefgh222 воспринимаются
как один символ.
Число символов в одной программе должно
быть не более 2048 (для настоящей версии
UniASM.
6.2. Локальный символ
Локальными называются символы, име-
ющие смысл только в определенной части
программы. Такая часть программы назы-
вается блоком локальных символов. Блок
локальных символов ограничен двумя гло-
бальными метками или началом и/или кон-
цом программы.
Глобальные символы, определенные ди-
рективой присваивания "=" не ограничива-
ют блок локальных символов. Таким обра-
зом в рамках блока локальных символов
можно определить глобальные метки.
Локальные символы начинаются двоето-
чием ":". За ним могут следовать буквы,
цифры и знак подчеркнутого пробела "_".
Прописьные буквы неотличимы от строчных.
Транслятор воспринимает только первые 8
знаков, не считая двоеточие.
Локальный символ должен быть опреде-
лен только раз в одном блоке локальных
символов.
Правила применения локальных симво-
лов аналогичны правилам применения гло-
бальных символов. Единственная разница
заключается в зоне определенности (при-
менимости).
Локальные символы позволяют примене-
ние одного и того же имя в качестве мет-
ки в разных разделах программы. В целях
удовлетворения правилам хорошего стиля
программирования рекомендуем применение
глобальных символов в качестве имен про-
цедур, переменных, констант и т.п., а
локальных символов - в качестве меток
внутри процедур.
Во время трансляции локальным симво-
лам не уделяется память, что позволяет
транслировать очень большие программы.
Один блок локальных символов не дол-
жен содержать более 255 локальных симво-
лов.
6.2 Константа.
Константы Ассемблера представляются
16-ным числом без знака.
В Ассемблере допустимы константы следу-
ющих типов :
- десятичное число 123,234,456
- 16-ное число - идентицируется зна-
ком $ $AB,$12,$F2
- двоичное число - идентицируется
знаком "%" %11,%01,%0001
- графический симмол - заключается в
апострофы и константе присваевается зна-
чение равное ASCII-коду символа.
Если апостроф применяется в качестве
графического символа, то он должен быть
удвоен.
Пример : 'ш','$','A',''''
- два графических символа - заключа-
ются в апострофы, константа определяется
длиной в слово, старший байт которого
равняется ASCII-коду первого символа, а
младший байт - коду второго символа.
6.3 Выражение.
Выражением называется последовательность
символов и/или констант, и/или символа
"." текущего значения счетчика адреса,
связанных операциями. Выражение может
начинаться знаком "<" или ">", опреде-
ляющим какой байт, старший или младший,
результата операций должен быть присвоен
в качестве значения выражения.
Значением выражения является 16-ное
число без знака.
Допустимы следующие операции (в скобках
графическое отображение операции) :
- изменение знака (-)
- сложение (+)
- вычитание (-)
- умножение (*)
- деление (/)
- логическое и (&)
- логическое или (!)
Все операции имеют одинаковый приоритет
и выполняются последовательно слева на
право. Последовательность выполнения
можно изменить применением скобок.
При выполнении операций учитываются
только младшие два байта результата.
Выражение может содержать любое число
уже определенных символов, или только
один неопределенный символ, который
будет определен далее в программе. Пос-
леднее не относится к случаем выражения,
принимающих участие в директивах ORG,
SECT и "=".
Если неопределенный симвал участвует
в выражении машинной инструкции, допус-
кающей прямую и расширенную адресацию,
то сгенерирована расширенная адресация
для этой инструкции. Таким образом в
объектном коде будет добавлен лишний
нуль. Поэтому не рекомендуется исполь-
зование неопределенных сомволов в таких
выражениях.
Примеры выражений :
2+2
Label1 - Label2
2*Label1+$231
'a'+'A'
'x' & %111
>Table
<Tabel
6.4 Список.
Списком называется последовательность
выражений, разделенных запятыми.
Если два соседних выражения содержат
один или два графических символа, за-
ключенные в апострофы, то эти выражения
могут быть объединены. Например, список
''st','r','in','g' можно представить
в виде 'string'
Примеры списков :
' This is string '
' This is another string',0
4,'boza'
'Fife o''clock a.m.',$d,$a
7. Отоносительный и абсолютный тип.
В языке Ассемблер символы, константы
и выражения (т.н. "величины") характери-
зуются не только значением, но и типом :
относительным или абсолютным.
Абсолютными являются величины, представ-
ляющие собой фиксированные адреса памяти
или числа. Поэтому константы всегда отно-
сятся к величинам абсолютного типа.
Отонсительными являются величины, пред-
ставляющие собой неопределенный во время
трансляции адрес памяти, который будет
определен во время загрузки или обработ-
ки связывающим редактором.
7.1 Тип символов.
Тип символов определяется по следующим
правилам :
1. Если символ определен директивой
присваивания "=", то он обладает типом
выражения.
2. Символы-метки являются величинами
отонсительного типа.
3. Символ текущего значения счетчика
адреса является величиной относительного
типа.
7.2 Тип выражения.
Тип выражения определяется типом операции
и ее операндов по следующим правилам :
________________________________________
тип операция тип тип
операнда1 операнда2 результата
________________________________________
относит. - относит. абсолют.
относит. - абсолют. относит.
абсолют. - относит. ошибка
относит. + относит. ошибка
относит. + абсолют. относит.
абсолют. + относит. относит.
абсолют. любая абсолют. абсолют.
________________________________________
Все остальные, кроме указанных в таб-
лице, выражения не допустимы и их резуль-
татом является ошибка.
Необходимо особо отметить еще раз, что
последовательность операции существенно
влияет на результат. Рассмотрим, напри-
мер следующие выражения :
1/ Label1+Label3-Label2-Label4
2/ Label1+(Label3-Label2)-Label4
3/ Label1-Label2+Label3-Label4
где Label1,Label2,Label3,Label4 отно-
сительные символы
Результатом выражения 1/ является
ошибка, а выражения 2/,3/ - абсолютный
тип.
7.3. Тип программной секции
Любая программа может включать нес-
колько секций. Каждая секция может быть
абсолютной или относительной в зависимо-
сти от того, будет ли выполняться с фик-
сированного адреса памяти или нет.
Формирование секции осуществляется
описанными ниже директивами ORG и SECT.
Тип секции соответствует типу выражения,
применен- ного при ее формировании.
При трансляции относительной секции
ассемблер генерирует не- обходимую для
осуществления перемещаемости информацию,
используе- мую редактором связей или в
процессе загрузки.
Нефиктивные секции могут быть вло-
женными на одном уровне вложения, не
учитывая содержащихся в них фиктивных
секций.
8. АДРЕСАЦИЯ МИКРОПРОЦЕССОРА СМ 601
Микропроцессор СМ-601 допускает 7 видов
адресации :
________________________________________
Наименование Синтаксис Длина Пример
________________________________________
Внутренняя 1 CLC
Inherent
Аккумуляторная 1 CLRA
Accumlator
Непосредств. #выражение 2(3) LDAB #$FF
Immediate
Прямая выражение 2 LDAB 0
Direct
Расширенная выражение 3 STAA $FFFF
Extended
Индексная выражение,Х 2 LDX 0,X
Indexed
Относительная выражение 2 BRA
Relative
________________________________________
Адресации длиной в 2 байта, исключая
относительную адресацию, требуют, что бы
результат вычисления выражения был аб-
солютного типа и меньше 256. Относитель-
ная адресация требует результат относи-
тельного типа в диапозоне [.-130 .+125].
*** В случае индексной адресации
допустим синтаксис Х вместо Х,0 или 0,Х.
Так как прямая и расширенная адреса-
ции имеют одинаковый синтаксис, для ко-
манд, допускающих оба вида адресации,
транслятор определяет вид генерируемой
адресации в зависимости от типа и зна-
чения выражения. Если, однако, в выра-
жении присутствует символ, определенный
далее в программе, транслятор генерирует
расширенную адресацию. Если нужно при-
менить расширенную адресацию, независимо
от значения выражения, необходимо непо-
средственно после мнемокода операции
ввести символ "*".
Непосредственная адресация имеет длину
в 3 байта только для команд LDX и LDS.
9. Директивы транслятору.
9.1 Директива определения символа.
Синтаксис : <символ>=<выражение>
Предназначение : определение символа.
Он принимает тип и зна-
чения результата вычис-
ления выражения.
Символ не должен быть определен ранее
и не может быть определен второй раз
далее в программе.
9.2 Директивы управления трансляцией.
9.2.0 CMD.
Синтаксис : CMD
Предназначение : задание тип CMD выходного
файла.
Директива должна быть первой директивой
исходного файла. Если в файле нет директивы
CMD, то выходной файл будет по умолчанию
типа OBJ.
9.2.1. ORG
Синтаксис: ORG [выражение]
Предназначение: формирование начала
новой программной секции или конца теку-
щей секции (если выражение пропущено).
Тип секции (абсолютный или относи-
тельный) соответствует типу выражения.
Новая секция имеет ЛОГИЧЕСКИЙ адрес,
равный значению выражения - формировании
секции не приводит к прерыванию последо-
вательности кода или к потере уже гене-
рированного кода. Выражение не должно
включать неопределенный символ.
Не разрешается применение директивы
внутри фиктивной секции, созданной ди-
рективой SECT.
Допускается вложение секций только
на одном уровне. Применение директивы
без параметра (без выражения) приводит к
формированию конца текущей секции и
возврату к предыдущей - восстанавливает-
ся значение счетчика адреса и тип сек-
ции.
9.2.2. SECT
Синтаксис: SECT [выражение]
Предназначение: формирование фик-
тивной секции, начиная с адреса, являю-
щегося значением выражения. Тип секции
определяется типом выражения.
Если выражение пропущено, секция
формируется с адреса, являющегося теку-
щим значением счетчика адреса. Конец
фиктивной секции формируется директивой
ENDS. Выражение не должно включать не-
определенный символ.
Внутри фиктивной секции не генериру-
ется код, но производится определение
меток и анализ исходного текста. Недо-
пустимо формирование одной фиктивной
секции (SECT ... ENDS) внутри другой
фиктивной секции.
Применение директивы SECT (без соот-
ветствующей ENDS) внутри фиктивной сек-
ции приводит к изменению значения счет-
чика адреса и типа секции.
9.2.4. CMD
Синтаксис: CMD [выражение]
Предназначение: задание типa CMD
выходного файла.
Директива должна быть применена в
исходном файле только раз и обязатель-
но до определения первого символа и до
первой инструкции.
В случае применения директивы все
метки становятся абсолютными и в выход-
ном файле не будет включена информация о
перемещаемости программы.
Значение выражения определяет на-
чальный адрес программы. Если выражение
пропущено, по умолчанию принимается
адрес $100.
Выражение должно быть абсолютного
типа и в нем не могут принимать учас-
тие неопределенные символы.
Если в файле нет директивы CMD,
выходной файл будет, по умолчанию, типа
OBJ. Файлы типа OBJ преобразуются в
выполнимые файлы программой OBJ2PGM
(OBJ2PGM <исх.файл> <вых.файл> ).
9.2.4.0 ENDS.
Синтаксис : ENDS
Предназначение : формирование конца
фиктивной секции, начало
которой задано директивой
SECT.
При выполнении директивы счетчику адреса
присваевается значение, которым обладал
до выполнения директивы SECT.
9.2.5. END
Синтаксис: END
Предназначение: формирование конца
программы.
Текст после директивы игнорируется.
9.2.6. MAIN
Синтаксис: MAIN
Предназначение: определение адреса
входной точки (стартового адреса) про-
граммы. Стартовый адрес равняется адре-
су последнего применения директивы.
Применение директивы MAIN после ди-
рективы CMD бессмыслено.
9.2.7. ERR
Синтаксис: ERR [выражение]
Предназначение: Контроль за соблю-
дение определенного условия - переход к
состоянию ОШИБКА если выражение имеет
ненулевое значение.
Выражение должно быть абсолютного
типа и нем не могут принимать участие
неопределенные символы. Если выражение
пропущено, состояние ОШИБКА возбуждается
всегда.
9.2.8. ENT
Синтаксис: <метка> ENT [выражение]
Предназначение: Объявленная метка
должна быть доступной для других модулей
провраммы.
9.2.9. EXT
Синтаксис: <метка> EXT
Предназначение: Объявление внешной
для данного модуля метки.
9.3.1. LIST
Синтаксис: LIST [выражение]
Предназначение: включение/прекраще-
ние создания листинга.
Выражение должно быть абсолютного
типа и не должно содержать неопределен-
ные символы.
Если выражение имеет значение 0,
листинг начинает выводиться, иначе -
вывод листинга прекращается. Если выра-
жение пропущено вывод листинга переклю-
чается альтернативно.
Директива в конце программы упра-
вляет выводом таблицы символов. Сама
директива в листинге не выводится.
Директива не влияет на работу ассем-
блера если при его вызове не был указан
параметр /l.
9.3.2. PAGE
Синтаксис: PAGE [выражение]
Предназначение: определение число
строк на странице листинга = значению
выра-жения и переход на новую страницу
или только переход на новую страницу
листинга (если выражение пропущено).
Директива выполняется если при вызове
ассемблера был указан параметр /l.
Если вывод листинга отменен дирек-
тивой LIST, директива PAGE может привес-
ти только к переопределению числа строк.
Выражение должно быть абсолютного типа и
не должно содержать неопределенные сим-
волы. Сама директива в листинге не
выводится.
9.4 Директивы определения данных.
9.4.1 DFB
Синтаксис : DFB <список выражений>
Предназначение : запись в объектом коде
последовательность бай-
тов, каждый из которых
является значением оче-
редного выражения.
Каждое выражение должно быть абсолют-
ного типа и иметь значение в [0,255].
9.4.2 DW
Синтаксис : DW <список выражений>
Предназначение : запись в объектом коде
последовательность слов
(старший байт, младший
байт), каждое из кото-
рых является значением
очередного выражения.
9.4.3 DS
Синтаксис : DS <выр.>[<список выр.>]
Предназначение : запись в объектном коде
последовательность бай-
тов, каждый из которых
является значением оче-
редного выражения. Зна-
чение выражения опреде-
ляет сколько раз будет
записана последователь-
ность байтов.
Если список выражений пропущен, то в
объектном коде пропускаются байты, число
которых определено значением выражения.
10. Диагностические сообщения
транслятора.
Ошибки обнаруживаемые во время транс-
ляции можно разделить на 2 группы:
фатальные и нефатальные.
Фатальными называем те ошибки, при об-
наружении которых не возможно продолжение
процесса трансляции.
В процессе трансляции не генерируется
объектный код в результате вводных строк,
в которых обнаружена ошибка.
Фатальные ошибки помечены знаком "!!!"
перед порядковым номером.
10.1 BRANGE OUT OF RANGE -
ответвление вне интервала. Попытка от-
носительной адресации вне интервала
[.-130 +125].
10.2 CONSTANT TOO LARGE -
константа больше допустимого. Попытка
присвоить константе значение больше
65535.
10.3 EXTRA CHRACTERS -
лишний символ. Поле комментария не на-
чинается символом ";".
!!! 10.4 I/O ERROR -
ошибка ввода/вывода. При вызове транс-
лятора не указано имя исходного файла
или не существует файл с указанным именем
или ошибка, в том числе - недостаточное
пространство на дискете, при попытке
записи выходного файла.
10.5 ILLEGAL CHAR IN LABEL -
недопустимый символ в метке.
10.6 ILLEGAL CHAR IN OPCODE -
недопустимый символ в коде операции.
Записанное в поле операции не является
машинной инструкцией или директивой
транслятору или в строке директивы прис-
ваивания нет метки.
10.7 ILLEGAL CHAR IN OPERAND -
недопустимый символ в операнде. Недо-
пустимый символ в поле операнда или
не хватает левой скобки.
10.8 INVALID ADDRESSING MODE -
неправильный вид адресации. Вид адреса-
ции ни соответствует команде или нали-
чие/отсутствие операнда не соответст-
вующего команде.
10.9 INVALID EXPRESSION TYPE -
неправильный тип выражения. Суммирование
относительных символов или вычитание
относительного из абсолютного символа
или попытка применить не разрешенную
операцию над относительным символом
или применение абсолютного выражения
в инструкции перехода или применение
относительнягя выражения в директиве
ORG.
10.10 INVALID EXPRESSION SIZE -
недопустимое значение выражения (при-
мененного в адресации, инструкции
INT xx или в директиве DFB).
10.11 INVALID OPCODE -
недопустимый код операции. В поле опе-
рации не записана машинная инструкция
или директива транслятору.
!!! 10.12 MEMORY FULL -
доступная транслятору оперативная па-
мять заполнена.
10.13 OPCODE NOT ALLOWED -
неразрешенный код операции. Попытка
применения директивы ORG или SECT
внутри фиктивной секции
10.14 RIGHT PARENTHESIS MISSING -
не хватает правой скобки.
10.15 SYMBOL ALREADY DEFINED -
символ уже определен в программе.
!!! 10.16 SYMBOL TABLE FULL -
переполнение таблицы символов.
10.17 UNEXPECTED END OF LINE -
неожиданный конец строки.В конце строки
не хватает символа, операнда, знака
и т.д., обязательный по правилам син-
таксиса.
10.18 UNDEFINED SYMBOL -
не определенный символ. Применение более
неопределенного символа в одном выражении
или применение неопределенного символа
в качестве параметра директивы ORG, SECT
или присваивания ("="), или применение
неопределенного до конца программы сим-
вола.