АССЕМБЛЕР

Описание ассемблера

Ассемблер предназначен для обеспечения программирования на языке ассемблирования системы "АГАТ". Ассемблер требует стандартного синтаксиса адресного режима системы "6502" и располагает широким набором директив ассемблирования. Исходные программы должны быть созданы с помощью редактора с описанным ниже форматом. Ассемблер вызывается путем установки, в меню редактора, курсора на директиве "АССЕМБЛИРОВАТЬ" и нажатии клавиши "ВВОД". После этого Вы окажетесь в меню ассемблера. Пользование меню ассемблера будет описано ниже.

Ассемблер выполняет трансляцию исходных операторов из исходного файла в машинные инструкции системы "6502" и записывает их в объектный (или в выходной) файл или в память. В течении первого прохода (проход один) ассемблер выполняет считывание (если исходный текст находится не в памяти) содержимого исходных файлов и генерирует символическую таблицу, присваивая величины всем символическим меткам, которые определены пользователем.

Кроме того, в течении этого прохода определяется длина всех инструкций, любые прямые обращения к еще не определенным меткам считаются абсолютными, а не к меткам нулевой страницы. Это требует того, чтобы все метки нулевой страницы (или однобайтовые метки) были определены до обращений к ним в исходных программах пользователя. Затем во второй проход ассемблер повторно считывает (если текст не в памяти) исходные файлы и обеспечивает генерацию фактических машинных инструкций, используя символическую таблицу для заполнения адресных частей данных инструкций. После (или во время, если выходной файл очень большой) выполнения второго прохода ассемблер обеспечивает запись объектных файлов в двоичный или перемещаемый (см. ниже) выходной файл.

Ассемблер обеспечивает генерацию сообщений об ошибках в течении двух указанных выше проходов и выводит распечатку (листинг) ассемблирования в течении выполнения второго прохода. Ассемблер передает этот вывод либо на экран дисплея системы "АГАТ", либо на экран и печатающее устройство одновременно. При необходимости ассемблер может обеспечить генерацию перемещаемого объектного файла. Этот тип файла ДОС (дисковой операционной системы) обеспечивает дополнительную информацию, которая необходима для перемещения машинных инструкций таким образом, чтобы они могли быть выполнены с адресами, отличающимися от адресов, полученных при ассемблировании объектного файла. Эта операция выполняется перемещающим загрузчиком без необходимости повторения процесса ассемблирования. Соответствующая дополнительная информация формирует словарь перемещений (или словарь RLD для краткости), который добавляется в конце машинных инструкций. Формат словаря перемещений описывается в следующих разделах.

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

Перед началом работы

Ассемблер вызывается по директиве "АССЕМБЛИРОВАТЬ" текстового редактора "ОТЛАДОЧНОГО КОМПЛЕКСА" системы "ШКОЛЬНИЦА". Ассемблер находится в памяти одновременно с редактором и отладчиком.

Подробнее о запуске "ОТЛАДОЧНОГО КОМПЛЕКСА" можно прочитать в описании текстового редактора системы "ШКОЛЬНИЦА".

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

Меню ассемблера

Меню ассемблера предназначено для передачи специальных начальных параметров ассемблеру. Оно представляет собой таблицу представленную ниже.


СТРЕЛКИ "ВВЕРХ"/"ВНИЗ"  ВЫБИРАЮТ
АЛЬТЕРНАТИВУ, <- и -> МЕНЯЮТ ЕЕ.
  "РЕД"  - ВОЗВРАТ В РЕДАКТОР.
 ПЕРЕВОД СТРОКИ - ЗАПРОС ФАЙЛА.

ПРОБЕЛ - НАЧАЛО  АССЕМБЛИРОВАНИЯ

  ИСХОДНЫЙ ФАЙЛ: <В ПАМЯТИ>
 ОБЪЕКТНЫЙ ФАЙЛ: <НЕТ>
   ИСХОДНОЕ ДЗУ: <НЕТ>
  ОБЪЕКТНОЕ ДЗУ: <НЕТ>
ВЫВОД НА БУМАГУ: ВЫКЛЮЧЕН
ЛОГИЧЕСКАЯ СТР.: 60
ФИЗИЧЕСКАЯ СТР.: <НЕТ>
 ТИП ОБЪЕКТНОГО: КОМАНДНЫЙ

Пользователем в меню может быть назначено имя исходного файла (ассемблирование с диска) или <В ПАМЯТИ> (ассемблирование из памяти), имя объектного файла или <НЕТ> (формирования объектного кода не будет), а также номер драйвера дисковода для исходного и объектного файлов. В директивы управления ДОС входит еще и директива назначающая тип выходного файла: КОМАНДНЫЙ (используется в отладчике и в РАПИРЕ) или BINARY (используется штатной ДОС системы "АГАТ"), команда на создание перемещаемого файла подается из исходного текста программы пользователя.

Имя объектного файла формируется из имени исходного файла к которому прибавляется приставка .КОД1. Если имя объектного файла будет набрано пользователем, приставка .КОД1 к нему прибавлена не будет. Если при ассемблировании будет получено несколько объектных файлов, очередное имя будет образовываться прибавлением единицы к коду последнго символа.

Оставшиеся три директивы предназначены для управления листингом программы: включения и выключения вывода листинга на бумагу, и установкой размера выводимой страницы.

Команды режима ассемблирования

В состав ассемблера включены несколько команд режима, которые позволяют пользователю управлять процессом ассемблирования в процессе его выполнения. Эти команды описываются ниже.

Отбрасывание ассемблирования

клавиша "F1"

Система "АГАТ" следит за клавиатурой в течении двух проходов процесса ассемблирования, но только команда отбрасывания оказывает воздействие на первый проход. Процесс ассемблирования может быть отброшен в любое время в течении любого прохода путем ввода команды "F1" с клавиатуры. Выполнение этой функции вызывает "очистку" ассемблера перед возвращением в меню. Такая очистка заключается в закрытии всех открытых файлов и в освобождении буферов ДОС, которые до этого использовались. Она не включает снятие выходных файлов, которые уже могли быть сгенерированы на выходном гибком магнитном диске. Последняя функция может быть выполнена путем выдачи команды "СТЕРЕТЬ ФАЙЛ" текстового редактора.

Приостановка вывода

Планка пробела

В течении выполнения второго прохода вывод может быть приостановлен путем нажатия клавиши "ПРОБЕЛ" на клавиатуре системы "АГАТ". Вывод может быть возобновлен путем ввода с клавиатуры любого символа, за исключением символов команд режима ассемблирования.

Вывод части программы

LST ON
или
LST OFF

Ассемблер имеет директиву LST ON или LST OFF, которая может быть введена в исходные тексты пользователя для управления тем, какие части листинга программы должны быть выведены. Это же самое средство может находиться под управлением с клавиатуры в течении второго прохода. Выполнение такой функции с клавиатуры отвергает текущее состояние варианта LST либо до следующей директивы LST в исходной программе, либо до следующей команды с клавиатуры (в зависимости от того, какое из этих событий произойдет первым). Таким образом пользователь может просматривать секции (части) листинга, включенные ранее в пределах исходной программы, или может выключать те секции, которые ранее были включены. Обычно это средство используется при работе только с большими программами, когда небольшая часть такой программы должна быть изменена и пользователь не хочет терять время на просмотр остальных частей.

Команда "LST OFF" (выключить листинг) представлена клавишей "F2", а команда "LST ON" (включить листинг) представлена клавишей "F3". Следует помнить, что ассемблер может встретить директиву LST, которая противоречит последнему вводу с клавиатуры, в пределах исходной программы. Для коррекции такой ситуации следует просто повторно ввести соответствующую команду с клавиатуры.

Формат исходной программы

Входные исходные файлы ассемблера представляют собой обычные текстовые файлы дисковой операционной системы, составленные из логических записей. Логическая запись представляет собой цепочку символов кода КОИ-8, которая заканчивается "ПЕРЕВОДОМ СТРОКИ" (код $8D). Все символы (кроме коментариев) должны иметь старший бит (MSB) установленным в единицу. Каждая из таких исходных записей разделяется на четыре следующих поля: метка, код операции, операнд и коментарий. Обычно такие поля разделяются одним или более пробелов.

Любая исходная запись или оператор должны содержать код операции (если только такая запись не является чистыми комментариями или пустой строкой). Ассемблер использует пробелы в качестве символов табуляции, поэтому следует помещать пробелы между полями, а не в пределах полей. Ассемблер не допускает использования нескольких операторов в одной записи или номера строк в исходных операторах (за исключением их использования в качестве коментариев).

Метка

МЕТКА
или
МЕТКА:

Метка является дополнительным полем за исключением тех случаев, которые отмечены при описании конкретных операторов. Любой исходный оператор может идентифицироваться символической меткой (за исключением чистых комментариев). Метка должна начинаться с буквы латинского или русского алфавитов и должна содержать только буквы, цифры и точки. В принципе, метка может содержать 1-250 символов, но практическим пределом является 16 символов. Метка может заканчиваться двоеточием или пробелом (или любым другим символом, который не является буквой, цифрой, точкой или символом "ПЕРЕВОД СТРОКИ"), этот символ игнорируется ассемблером. В метках не могут содержаться вложенные пробелы.

Метка должна всегда начинаться с позиции первого символа в записи. Все метки или символические имена должны быть однозначными, т.е. любое символическое имя в данной программе должно быть определено только один раз, даже если это программа на нескольких файлах. При попытке создания двух индентичных символических обозначений ассемблер будет выдавать ошибку "ПОВТОРНОЕ ОПИСАНИЕ МЕТКИ". Все символы символического имени имеют значение при определении его однозначности. Когда символические имена используются с исходным оператором (за исключением директивы "EQU"), величина, присвоенная соответствующему символическому имени, будет текущим адресом, который вычисляется ассемблером для данной строки.

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

Хорошим методом программирования является определение всех символических имен данных (помимо программных меток) в начале программы пользователя. Это обеспечивается путем использования директив "DSECT" и "DEND" ассемблера.

Код операции

Второе поле исходного оператора является полем кода операции. Это поле должно быть отделено от поля метки по крайней мере одним пробелом. Если метка отсутствует, то коду операции должен предшествовать как минимум один пробел. Коды операций состоят из двух или из большего числа букв, заканчивающихся пробелом. Эти мнемонические обозначения аналогичны мнемоническим обозначениям для систем "MOS Technology" с добавлением нескольких синонимов для инструкций переходов. Однако используемые директивы ассемблирования не являются стандартными директивами системы "MOS Technology". Полная таблица кодов операций и директив ассемблера приводится в приложении.

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

Поле операнда

Поле операнда оператора требуется для некоторых кодов операций и не требуется для других. Обычно такое поле состоит из выражения, сформированного на основе констант, меток и арифметических операторов (т.е. знаков арифметических операций). Все эти операции не имеют другого порядка или старшинства, кроме их приведения слева направо. Ассемблер распознает синтаксис режима адресации системы "6502" "MOS Technology". Сводка соответствующей информации приводится ниже, но если пользователь не знаком с программированием на системе "6502", то до начала кодировки ему рекомендуется прочитать руководство по программированию для этой системы.

Поле комментариев

Поле комментариев (которое всегда является дополнительным) используется для документирования того, что делает программа. Ассемблер игнорирует поле комментариев и только распечатывает его вместе с остальными операторами при выводе листинга программы. Комментарии могут содержать любой произвольный ряд символов в коде КОИ-8 и должны быть отделены от поля операнда пробелом. Когда ассемблер может однозначно определить где заканчивается предыдущее поле операции и операнда, ему не нужен пробел.

Ассемблер распознает также операторы, которые начинаются с ежика (*) в позиции первого символа. Такие операторы целиком рассматриваются как комментарии, игнорируются и только выводятся ассемблером. Для указания комментариев в качестве первого символа может быть также использована точка с запятой.

Формирование поля операнда

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

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

Метки

Метки в общем случае представляют собой символические имена для 16-ти битовых величин определенного типа. Система "6502" имеет два таких типа: величины, 8 старших битов которых являются нулями. Первый тип называется метками нулевой страницы. Величина, присваиваемая метке, определяется типом оператора, в котором она приводится. Если метка находится в операторе, который генерирует машинный код или резервирует некоторую область в памяти, то соответствующей метке присваивается величина счетчика адреса программы, к которому она относится. Это будет всегда 16-ти битовая величина одного или другого типа. Если метка приводится в псевдооперации "EQUate" (приравнивание), то ей присваивается величина оцененного выражения операнда. Когда метка приводится в поле операнда, ассемблер подставляет величину для этой метки при вычислении величины соответствующего операнда.

При использовании меток можно выделить один из двух байтов меток как восемиразрядное слово. Это достигается путем установки перед именем знаков < и >. Знак < позволяет выделить старший байт шестнадцатиразрядного числа, а знак > - младший. Причем записи "LDA #>METKA" и "LDA #METKA" индентичны.

Константы

В выражениях операндов ассемблер распознает пять следующих типов констант: символьные константы и четыре типа числовых констант. Константы используются для представления фактических элементов данных, как, например, символы в коде КОИ-8, таблицы данных, адресные смещения, абсолютные адреса аппаратных устройств или ячейки зафиксированные структурой микропроцессора типа "6502". Константа имеет фиксированную величину, которая является очевидной при рассмотрении соответствующей константы, а метка имеет величину, которая может изменяться при изменении программы или при ее размещении в другом месте памяти.

Десятичные константы

Десятичные константы представляют числа с основанием 10. Десятичная константа является положительным целым числом в диапазоне 0 - 65535, составленным из последовательности десятичных цифр 0-9. Ассемблер рассматривает любую числовую константу в качестве десятичной, если только ей не предшествует символ шестнадцатиричного или другого основания. Если числовая константа оценивается в число, большее чем 16-ти битовое двоичное число, то ассемблер генерирует сообщение об ошибке числового переполнения для соответствующего выражения.

Шестнадцатиричные константы

Шестнадцатиричные константы представляют числа с основанием 16. Символы, которые используются для представления шестнадцатиричных констант, представляют собой десятичные цифры 0-9 и буквы A-F (для представления десятичных величин 10-15). Шестнадцатиричным константам должен предшествовать символ шестнадцатиричного основания - знак доллара ($, на клавиатуре он находится под клавишей 4). Этот знак не может использоваться для других целей в числовых константах, но допускается в качестве символа в символьных константах. Ассемблер заканчивает рассматриваемую числовую константу любого типа, тогда, когда обнаруживает символ, недействительный для константы соответствующего типа. Кроме того, если такой символ заканчивает последний простой операнд выражения, то этот символ будет рассматриваться в качестве начала поля комментариев.

Восьмеричные константы

Восьмеричные константы представляют числа с основанием 8. Обычно такие числа не используются со сверхмалыми вычислительными машинами, но многие программисты в течении многих лет работали с ними, поэтому они включены для удобства тех, кто хочет их использовать. Цифры, используемые для представления восьмеричных констант, являются десятичными цифрами 0-7. Восьмеричным константам должен предшествовать символ восьмеричного основания (знак @). Этот знак не может быть использован для других целей в числовых константах, но его использование в символьных константах допускается. Восьмеричные константы заканчиваются таким же образом как и шестнадцатиричные за исключением того, что цифры 8 и 9 не являются действительными восьмеричными символами.

Двоичные константы

Двоичные константы представляют собой числа с основанием 2. Допустимыми символами для этих констант являются 0 и 1. Двоичным константам должен предшествовать символ двоичного основания (знак :). Как и в других числовых константах этот знак не может быть использован для других целей, кроме символьных констант.

Символьные константы

Символьные константы представляют последовательности символов в коде КОИ-8 и определяются путем заключения соответствующих символов в одинарные кавычки ('). Цепочка не может пересекать границ оператора и может состоять максимально из 240-ка символов по длине. Когда символьная константа используется в качестве операнда в выражении непосредственного режима, для нее можно не использовать конечную кавычку, так как такая цепочка может состоять только из одного символа. Величиной символа является соответствующий ему код КОИ-8. Величина, присваиваемая старшему биту (MSB) определяется директивой "MSB" ассемблера, если только она не используется с псевдооперацией "DCI", которая имеет стандартную комбинацию, связанную с установкой этого старшего бита.

Зарезервировнные слова

Обычно ассемблер системы "6502" препятствует использованию односимвольных зарезервированных слов A, X, Y, P, S в качестве меток в исходных программах. Данный ассемблер позволяет пользователю применять любое из этих слов в качестве метки оператора, но запрещает использовать символ A в качестве метки в выражении операнда. Предполагается, что пользователь не будет применять эти или любые другие односимвольные метки для обеспечения совместимости своих исходных программ со стандартным синтаксисом системы "6502".

Арифметичекие операторы

Ассемблер обеспечивает четыре арифметических оператора (т.е. знака арифметических операций) +, -, *, /, для использования при создании простых линейных адресных выражений. При выполнении соответствующих арифметических операций ассемблер не выполняет проверки возможного числового переполнения результатов; он просто сохраняет 16-ти битовые результаты, обеспечивая таким образом вычисления циклических адресов. Когда ассемблер получил указание о необходимости генерации перемещаемого выходного модуля, он не разрешает применение операций умножения и деления в отношении соответствующего символического имени, так как это будет препятствовать получению перемещаемого результата.

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

&-логическая операция "И"
!-логическая операция "ИЛИ"
%-логическая операция "ИСКЛЮЧАЮЩЕЕ ИЛИ"

Адресные выражения

Ассемблер обеспечивает простые линейные адресные выражения, состоящие из простых операндов и описанных выше арифметических операторов (знаков операций). Действительный синтаксис выражения в форме "BNF" приводится ниже:

Простой операнд :=Символическая метка ! Константа
(Поп)
Арифметический оператор :=+ ! - ! * ! /
(Аоп)
Выражение := Поп {Аоп Поп {Аоп Поп}...}

Данное синтаксическое определение гласит: "Выражение представляет собой простой операнд, дополнительно сопровождаемый одной или несколькими последовательностями арифметический оператор-простой операнд". Такое выражение оценивается с левой стороны в правую сторону.

Данное синтаксическое определение указывает также, что элемент Аоп (арифметический оператор) не может быть первым членом в выражении и не может быть последним членом. В адресном выражении не должно содержаться пробелов. Если в нем содержится пробел, то часть после пробела будет считываться как комментарий. Несоблюдение этих правил при формировании выражений будет обычно приводить к выдаче ошибки НЕДОПУСТИМОЕ ВЫРАЖЕНИЕ для соответствующей исходной строки в течении второго прохода ассемблирования.

Директивы ассемблера

Директивы, описываемые в данном разделе, используются для направления общего функционирования процесса ассемблирования, а также для индентификации для ассемблера тех меток, которые являются фиксированными адресами или имеют специальные значения. Каждая такая директива используется как обычный код операции в исходной строке. Для некоторых из этих кодов псевдоопераций требуются метки, так как они используются для установления величины метки или некоторой специальной характеристикой метки. Любой из этих директив может предшествовать метка, за любой из них могут следовать комментарии (или то и другое вместе).

ORG

ORG выражение

Директива ORG устанавливает источник объектного кода. Метка является дополнительной и символические метки, используемые в выражении, должны быть определены до оператора ORG. Наличие оператора ORG требуется для обеспечения генерации выходного файла ассемблера. Если данный оператор не приводится, то ассемблер будет создавать только листинг, не создавая объектного файла. Ассемблер распознает два следующих типа операторов ORG: абсолютный и относительный.

Относительный оператор ORG-это такой оператор, в котором содержатся перемещаемые символические имена, и который, поэтому, изменяет позицию в текущем объектном файле. Абсолютный оператор ORG является таким оператором, в котором содержится абсолютное выражение, означающее обычно константу. Каждый такой абсолютный оператор используется ассемблером для определения адреса с целью присвоения его операторам генерации кода. Он также используется для управления адресом, помещаемым в выходной файл, который будет использоваться ДОС при последующей загрузке или при прогоне (с помощью команд BLOAD, BRUN, [LOAD, [RUN) соответствующего объектного файла. Ассемблер генерирует новый выходной файл для каждого абсолютного оператора ORG, встреченного в течении выполнения ассемблирования.

Если выходной файл небольшого размера, то обычно имеет место только одна такая директива ORG, но если приводится вторая, то текущая закрывается, объектный файл записывается на диск и начинается новый выходной файл. Каждый раз, когда имеет место такая ситуация, последний символ объектного имени получает приращение на единицу для формирования однозначного имени файла. На пользователе лежит ответственнось за правильность использования нескольких таких выходных файлов или за их последующее комбинирование для выполнения при необходимости. При генерировании перемещаемых объектных файлов словарь RLD очищается при обнаружении каждого абсолютного оператора ORG, поэтому каждый сегмент такого ассемблирования будет иметь свой собственый отдельный словарь перемещений.

OBJ

OBJ выражение

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

EQU

МЕТКА EQU ВЫРАЖЕНИЕ

Директива EQUate (приравнивание) используется для присвоения величины символической метке, при чем такая метка должна присутствовать, но не должна быть использована в качестве метки в других операторах. В течении выполнения первого прохода ассемблер оценивает выражение и присваивает соответствующую величину этой символьной метке.

Назначение использования символических меток состоит в создании исходной программы, которая понятна для людей, а не только для вычислительной машины. При написании программы интенсивное использование данной директивы обеспечивает создание такой программы, которую будет легко изменить и понять через годы после ее написания. Оператор EQU обеспечивает простой способ присвоения имени даже символу кода КОИ-8, который может служить в соответствующей программе в качестве специального разделителя. Использование данной директивы, помимо использования символьной константы во многих местах программы, делает возможным изменения многих программных функций без необходимости редактирования многих строк соответствующей программы для выполнения таких изменений.

MSB

MSB ON
или
MSB OFF

Данная директива обеспечивает способы управления величиной старшего бита генерируемых ассемблером символов. В течении ассемблирования программы псевдооперация MSB может быть изменена столько раз, сколько это является необходимым. Воздействию данной директивы подвергаются те символы, которые генерируются как непосредственные символьные константы, а также символьные операнды псевдооперации ASC (но не псевдооперации DCI).

По умолчанию ассемблер устанавливает директиву MSB ON (старший бит установлен), так как система "АГАТ" ожидает именно такой установки символов кода КОИ-8 для обычного воспроизведения.

DSECT

DSECT

Данная директива используется для определения области в памяти (например, таблицы данных или управляющего блока команд) без фактической генерации какого-либо выходного объектного кода. Данная директива используется для маркировки начала блока или группы операторов, которые определяют величины меток, используемых для обращения к такой области в памяти. Наиболее общим методом использования данной директивы является определение меток элементов данных, указателей и т.д., которые приводятся на нулевой странице памяти системы "6502".

Данная директива вызывает неявную адресацию к нулю директивы ORG и временно приостанавливает вывод объектного кода. Директива DSECT может содержать большинство операторов ассемблера, включая и оператор ORG. Имя DSECT происходит от словосочетания Dummy SECTion (холостая секция), и называется так по причине того, что не генерирует отображения вывода. Когда данная директива начата, она продолжает действовать вплоть до появления директивы DEND. Если в пределах данной директивы (DSECT) имеется оператор ORG, то он используется только для управления адресами, присваиваемыми меткам в пределах этой директивы, а не выполняется как обычный описанный выше оператор ORG, не изменяет текущий адрес или содержимое счетчика программы, который сохраняется на длительность действия процедуры DSECT.

Нельзя использовать вложенные директивы DSECT путем введения одной такой директивы в другую.

DEND

DEND

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

Если директива DSECT была начата и нигде не заканчивается директивой DEND, то оставшаяся часть программы пользователя (после оператора DSECT) будет выводиться как обычный листинг ассемблирования, но выходной файл генерироваться при этом не будет. Такой пропуск директивы DEND может быть источником таинственного исчезновения соответсвующего объектного кода в выходных файлах пользователя.

REL

REL

Директива RELocatable (перемещаемый) вызывает создание ассемблером словаря перемещений для использования программой перемещающего загрузчика. Словарь перемещений (RLD) создается только в процессе ассемблирования и записывается в объектный файл только в том случае, если псевдооперация REL приводится в исходной программе. Когда используется данная директива, объектному файлу присваивается новый символ типа (буква R в каталоге штатной ДОС и буква П в каталоге ДОС системы "ШКОЛЬНИЦА"). Данный файл имеет новый формат, определяемый в следующем разделе и не может быть использован командами BLOAD, BRUN, [LOAD и [RUN дисковых операционных систем соответсвенно штатной и системы "ШКОЛЬНИЦА". Формат псевдооперации REL соответствует формату псевдооперации DEND за исключением мнемонического обозначения.

Для правильного функционирования псевдооперации REL должна приводиться в самом начале исходного файла до использования любых символических имен.

EXTRN

EXTRN МЕТКА

Директива EXTeRNal (внешний) используется для указания обращения к внешне определенному символическому имени. Такие символические имена всегда рассматриваются как двухбайтовые (или длинные) символические имена, а не как символические имена нулевой страницы. Ассемблер обеспечивает генерацию нулей в адресной части инструкций, обращающихся к символическим именам, которые определены как внешние. Если используется псевдооперация REL, а символические имена определяются как внешние (EXTeRNal), то ассемблер добавляет справочник внешних символических имен после словаря перемещений RLD в перемещаемый объектный файл. Данный словарь (справочник) будет использоваться связывающей программой загрузчиком, которая разрешает эти внешние обращения от других модулей (возможно в библиотеке модулей).

Справочник внешних символических имен (или ESD), который может быть добавлен к перемещаемому файлу, является общим для всех сегментов ассемблирования нескольких выходных файлов, так как эта информация находится в символической таблице, а не в таблице словаря перемещений.

Дополнительный параметр МЕТКА в поле метки директивы EXTRN служит только для определения данной метки с текущей величиной адреса программы. Метка после псевдооперации EXTRN является меткой, которая определена как внешнее символическое имя. Псевдооперация EXTRN не должна использоваться внутри директивы DSECT.

ENTRY

ENTRY МЕТКА

Директива ENTRY (вход) является дополнением псевдооперации EXTRN и используется для определения того, какие символические имена в программе могут опрашиваться (EXTERned) другой программой. В программе могут быть использованы несколько таких символических имен для определения альтернативных точек входа модуля, затем такие символические имена отмечаются в справочнике внешних символических имен (ESD) вместе с необходимой информацией для связи других модулей с соответствующей точкой входа.

Метка после псевдооперации ENTRY является меткой, которая определяется в качестве метки точки входа. Величина данной метки обычно определяется в некотором другом месте, но может быть и дополнительным полем метки соответствующего оператора ENTRY. Если это так, то соответствующая точка входа определяется текущей величиной счетчика программы в точке оператора ENTRY. Данный оператор не должен быть использован внутри директивы DSECT.

Обе псевдооперации ENTRY и EXTRN могут быть применены даже в том случае, когда не используется директива REL, и будут включены в ассемблер для полноты даже если загрузчик связи не был написан для обеспечения использования справочника внешних символических имен. Использование данных директив обеспечивает удобный способ определения адреса, который заполняется во время выполнения при создании самомодифицирующегося кода. Псевдооперация ENTRY никогда ничего не создает в части машинного кода выходного файла; псевдооперация EXTRN позволяет неопределенным символическим именам оставаться неопределенными без генерации сообщния об ошибке по этому поводу.

CHN

CHN имя файла,номер разъема дисковода,номер драйвера диска

Директива CHaiN (цепочка) используется для связи сегментов большой исходной программы. Выражения разъема и драйвера являются дополнительными, параметр "имя файла" является требуемым. Все операторы после данной директивы будут игнорироваться, поэтому она, обычно, является последним оператором исходного файла. Ассемблер будет выполнять отбрасывание с ошибкой ФАЙЛ НЕ НАЙДЕН в том случае, если приведенное имя файла не существует на текущем или указанном диске. Ассемблер не выполняет проверку того, что такой дисковод (какой указан в директиве) фактически существует, поэтому, если пользователь адресуется к несуществующему дисководу, то ДОС выдаст ошибку обмена с ДЗУ, которая отбросит соответствующий процесс ассемблирования с ошибкой обмена. Правильность диапазона выражения разъема и драйвера дисковода (2-6 и 1-2 соответственно) проверяется.

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

Директивы вывода

Директивы вывода предназначены для обеспечения управления форматом и прдставлением вывода (листинга) ассемблра. Использование данных директив вовсе не является обязательным, но их применение обеспечивает экономию места в исходных файлах, а также улучшает читабильность вывода (листинга) на экран дисплея и на печать.

Большинство данных директивт вывода воспринимают метку в пределах самого поля метки. Этим вложенным псевдооперациям будет присваиваться текущий адрес счетчика программы, но многие из этих псевдоопераций выполняют определенные функции, но не выводят фактической строки листинга. Этло может привести к определению метки без ее печати (или вывода на экран), хотя она будет воспроизводиться при использовании редактора. Не рекомендуется определять метки таким способом.

PAGE

PAGE

Данная директива вызывает выполнения перевода страницы путем передачи символа перевода формата кода КОИ 8 на усройство вывода. Данная директива не выводится в качестве строки в листинге, но ее присутствие указывается ее действием и "потерей" номера строки в листинге. При использовании редактора этот номер может быть найден путем редактирования соответствующей строки.

LST

LST ON
или
LST OFF

Директива LiST (вывод) обеспечивает способы подавления части исходного вывода (листинга) или всего вывода. Выключение вывода (LST OFF) путем использования данной директивы может увеличить скорость процесса ассемблирования; это особенно ощутимо при выводе большого процесса ассемблирования на печатающее устройство. Любое число данных директив может быть использовано для избирательного включения (LST ON) и выключения (LST OFF) различных частей вывода.

REP

REP выражение

Директива REPeat (повторение) используется для создания цепочки символов, начиная с первого символа в исходной строке части вывода (листинга). Это часто используется для создания строки ежиков выделения заголовков комментариев в начале подпрограмм или модулей. Данная псевдооперация обеспечивает экономию области файла исходной программы путем сжатия большого числа символов, которые требуются для создания длинной строки, до 6-ти или 7-ми символов. Повторяемым по умолчанию символом является ежик (*). Этот символ может быть изменем путем использования описываемой ниже директивы CHR. Может быть использовано любое число данных директив (REP) в описываемом ниже формате.

Выражение рассматривается по модулю 256, т.е. может быть распечатано (или выведено на экран) от одного до 256 определенных в данное время символов (CHR). Другими словами если величина выражения является числом, содержащим более чем 8 битов, то будут использованы 8 младших битов, а остальные биты будут игнорироваться.

CHR

CHR ?

Директива CHaRaster используется для изменения символа, повторяемого с помощью директивы REP. Знак вопроса (?) представляет собой символ, который пользователь хотел бы видеть напечатанным (или выведенным на экран). Любое число таких директив может быть использовано для изменения символов в различных частях выводимой распечатки (листинга).

SKP

SKP выражение

Директива SKiP (пропуск) обеспечивает способ для введения некоторого числа пустых строк в листинг путем передачи символа возврата каретки кода КОИ 8 на устройство вывода. Выражение рассматривается таким же образом, как и выражение в псевдооперации REP.

SBTL

SBTL строка

Директива SuBTitLe (подзаголовок) обеспечивает строку заголовка (которая определяется параметром строка) в верхней части каждой страницы файла вывода (листинга). Использование данной директивы является вовсе не обязательным, но она обеспечивает удобные способы индентификации конкретных листингов. Данная псевдооперация приводит к тому, что в первой строке на каждой странице содержатся: слева-номер страницы, в центре-параметр строка, справа индентификатор системы программирования. Кроме того будут выданы комментарии над таблицами меток.

Директивы определения данных

Данные директивы используются для распределения или для определения областей данных в пределах программы ассемблера. Специальные директивы обеспечиваются для адресных таблиц и для сообщений, так как эти структуры данных являются весьма общими в программах ассемблирования. Этим директивам могут предшествовать метки, а за ними могут следовать комментарии (т.е. они могут сопровождаться как метками, так и комментариями).

ASC

ASC строка

Директива ASC определяет цепочку из 8-ми битовых байтов в выходном объектном файле, которые заполняются величинами кода КОИ 8 (это величины символов символьной константы директивы ASC). Все байты, которые генерируются данной псевдооперацией, распечатываются (или выводятся на экран) в выходном листинге, при чем исходная строка распечатывается в первой строке вывода. Три или еще меньшее число байтов распечатываются в каждой строке без номера до тех пор, пока не будут распечатаны все соответствующие байты. Если вместе с данной псевдооперацией использовалась метка, то ей присваивается текущая величина счетчика программы, которая будет представлять собой адрес первого символа символьной константы в памяти.

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

DCI

DCI строка

Данная директива функционирует аналогично директиве ASC за исключением того, что псевдооперация MSB не обеспечивает управления установкой старшего бита в каждом байте. Вместо этого все байты цепочки DCI (кроме последнего) имеют нулевой старший бит, а старший бит последнего последнего байта этой цепочки установлен в единицу. Формат данной команды аналогичен формату команды ASC.

DFB

DFB выражение {,выражение...}

Директива DeFinе Byte (определение байта) используется для раздельного определения одного или нескольких байтов. Ассемблер оценивает каждое выражение и использует полученную в результате величину (по модулю 256) в качестве величины для каждого байта. Метка псевдооперации DFB будет иметь адрес первого сгенерированного байта. Если генерируемые байты вычисляются на основнии перемещаемого выражения, то для каждого такого байта будет обеспечиваться запись (вход) в словаре перемещений (RLD), поэтому соответствующая величина может быть перемещена. Рекомендуется ограничивать директиву DFB до 5-ти - 10-ти выражений и использовать нескольких таких директив вместо большого числа выражений в одной директиве. Единственным допустимым разделителем между выражениями является запятая.

DW

DW выражение

Директива Define Word (определение слова) используется для определения двухбайтового слова системы "6502". Слово системы "6502" является особым в том смысле, что младшие 8 битов 16-ти битового выражения записываются в первом из двух байтов, а старшие 8 битов записываются во втором байте. Это именно тот порядок, в котором байты должны находится для возможности использования 16-ти битового адреса в качестве указателя косвенного адреса, что используется косвенными индексированными инструкциями и инструкциями косвенного перехода микропроцессора типа "6502". Метка дает величину адреса программы, который является адресом первого или младшего байта слова.

DDB

DDB выражение

Директива Define Double Byte (определение двойного байта) аналогична описанной выше директиве DW за исключением того, что соответствующие байты записываются в обратном порядке (т.е. старший байт первым, а младший байт вторым).

DS

DS выражение

Директива Define Storade (определение памяти) используется для резервирования группы байтов без определения того, что должно быть занесено в эти байты. Выражение данной директивы не должно иметь никаких прямых обращений. Размер области резервируемой с помощью данной псевдооперации, включается в размер объектного выходного модуля. Это означает, что если пользователь случайно ввел директиву DS с выражением,которое имеет величину например 48K, то он неожиданно получит очень большой выходной файл.

Наиболее часто используются выражения, представляющие собой относительно небольшие константы для небольших областей данных, так как большие буферы и рабочие области не должны быть частью объектной программы (за исключением того случая, когда пользователю некуда девать память, представляемую гибким магнитным диском).

Метке будет присваиваться адрес первого байта распределяемой резервируемой области. Когда данная директива используется в псевдооперации DSECT, то никакая область фактически не резервируется, но, но это является простым способом для опредления структуры данных, в которую можно делать дополнительные введения путем добавления дополнительных операторов DS и без необходимости редактирования каких либо других операторов до повторного ассемблирования.

Директивы условного ассемблирования

Основное средство условного ассмблирования включено в ассемблер. Это средство позволяет программисту условно (т.е. в соответствии с условиями) выбирать альтернативные секции исходного кода для их включения в ассемблированный объектный файл или для их исключения из этого файла. Условное ассемблирование наиболее часто используется для написания отдельных "общих" программ, которые включают несколько общих условий (например производство относительно проверки или "машинная конфигурация X" относительно "манишшой конфигурации Y". Для условного ассемблирования используются три следующих директивы: DO, ELSE, FINish. Директивы DO и FIN всегда должны использоваться парой для обозначения соответсятвенно начала и конца секции условных операторов. Директива ELSE допускается только в пределе блока операторов DO-FIN. Все управление условным ассемблированием осуществляется с помощью оператора DO, а оператор ELSE используется для инвертирования условия, которое определено оператром DO. Этим директивам могут предшествовать метки, за ними могутследовать комментарии (т.е. они могут сопровождаться метками и комментариями).

DO

DO выражение

Данная директива выполняет для аасемблера две задачи. Одна из них заключается в обозначении (маркировка) начала условного блока исходных операторов. Вторая задача заключается в оценке соответствующего выражения (параметр "выражение") для определения того, должен или нет ассемблироваться блок соответствующих операторов. выражние оператора DO оценивается в течении первого прохода ассемблирования, а поэтому в нем не могут содержаться какие-либо прямые (в прямом направлении) обращения к неопределенным или к внешним меткам. Если результат оценки соответствующего выражения является ненулевым, то ассемблер продолжает выполнять ассемблирование операторов в пределах данного блока. Другими словами условием для ассемблирования является истинность выражения или включение ассемблирования.

Если, с другой стороны, результатом оценки выражения является нуль, то ассемблер начинает пропуск исходных операторов (хотя они выводятся и отмечаются как пропущенные) вплоть до оператора FIN, который завершает условное ассемблирование. Таким образом это условие является ложным или условием выключения ассемблирования.

ELSE

ELSE

Данная директива может приводиться только внутри блока услового асеемблирования, который ограничен директивами DO-FIN. Директива ELSE дополняет или инвертирует состояние условия, которое имеет место в результате оценки выражения предыдущего оператора DO. Если это состояние выключения ассемблирования (OFF), то оно изменяется на состояние включение (ON) и наоборот. Другими словами если исходные операторы должны быть пропущены вплоть до директивы FIN. Если ассемблирование продолжалось, то директива начинает пропуск исходных операторов вплоть до директивы FIN. Это средство предназначется для обеспечения возможности выбора альтернативных блоков кода с помощью одной последовательности директив ассемблера. Ниже приводится небольшой пример:

*SYSTEM EQU 'ШКОЛЬНИЦА
*SYSTEM EQU 'BASIC
SYSTEM EQU 'MONITOR
        !
        !
 DO  SYSTEM-'Ш
 ELSE
COUT EQU $18C9
 FIN

 DO  SYSTEM-'B
 ELSE
COUT EQU $FDDF
 FIN

 DO  SYSTEM-'M
 ELSE
COUT EQU $FDD7
 FIN

В этом примере выбирается подпрограмма вывода символа на экран (COUT) для одной из трех систем: ШКОЛЬНИЦА, BASIC, MONITOR. Выбраной является та система против которой отсутствует символ ежик (*), т.е. та строка которая не является чистым комментрием. В данном случае это MONITOR.

Следует отметить, что порядок первых букв директив DO, ELSE, FIN (т.е. D, E, F) является алфавитным, а это единственный правильный порядок использования трех этих директив. Использование директивы ELSE является целиком дополнительным по усмотрению пользователя. Кроме того между директивами DO и ELSE не обязательно должны быть приведены какие-либо операторы, а тиким образом обеспечивается конструкция DO NOT (т.е. НЕ DO). Данную конструкцию удобно использовать при необходимости разделения дополнительных блоков исходного текста, и некоторой общей секции текста, которая может приводиться перед альтернативой и после другой альтернативы. Это обеспечивает также возможность использования одного выражения в самых различных областях программы, которые должны ассемблироваться противоположными путями при общем условии.

Вывод символьной таблицы

Ассемблер имеет третью фазу, которая создает дополнительную распечатку (листинг или вывод на экран) символьной таблицы. Этот вывод обеспечивается два раза, сначала в алфавитном порядке, а затем в адресном порядке. Вывод символической таблицы подавляется при отбрасывании ассемблирования в результате ввода с клавиатуры команды F1 или в результате выдачи псевдооперации LST OFF или команды F2. Приведение псевдооперации LST OFF в конце исходной программы пользователя обеспечивает подавление двух выводов символической табицы. Подавление всего вывода (листинга) ассемблирования путем помещения псевдооперации LST OFF в начале программы, а псевдооперации LST ON в конце соответствующей программы будет приводить к выводу листинга только символической таблицы.

Вывод листинга символической таблицы автоматически согласует свой формат с экраном дисплея на 64 колонки системы "АГАТ" или с печатающим устройством. Символическая таблица будет выводиться в трех колонках на экране и в четырех на печатающем устройстве. В таком листинге содержится только 14 символов любой метки, которые сортируются в соответствии с этим числом.

Различные специальные характеристики меток могут быть определены на основе формата распечатки (или вывода на экран) адресов и сомволов специальных флажков, которые выводятся непосредственно перед соответствующей величиной адреса. Распечатка символического адреса с двумя начальными пробелами является указанием того, что ассемблер рассматривет данное символическое имя в качестве адреса нулевой страницы. Если распечатываются два начальных нуля, то это указывет, что ассемблеру было необходимо рассматривать соответствующий адрес в качестве абсолютного адреса по причине прямого обращения (даже если это был адрес нулевой станицы, определенный до его использования). Такая ситуация обычно корректируется путем перемещения директивы DSECT или директивы EQU в начало программы пользователя.

Вопросительный знак (?) перед адресом указывает символическое имя, которое было определено, но нигде не опрашивается. Ежик (*) указывает символическое имя, которое опрашивается, но нигде не определено, что вызывает выдачу одной или нескольких ошибок НЕ СУЩЕСТВУЮЩАЯ МЕТКА. символ X перед адресом указывает, что соответствующее символическое имя является внешним символическим именем, а буква N указывает, что соответствующее символическое имя является символическим именем точки входа.

По причине ограничений, которые связаны с возможностьями проверки синтаксиса ассемблером, пользователь может случайно ввести в свою программу неправильную строку, а ассемблер не обеспечит ее отвержения. Если имеет место такая ситуация и пользователь прогоняет свою программу, то система может зависнуть или программа может выполняться неправильно. Когда пользователь будет просматривать при этом объектный код, счетчик программы может перейти с ячейки $400 на ячейку $2000, или может произойти неправильный переход. Ниже приводится пример такой неправильной строки в программе пользователя.

Пример: Строка должна иметь ряд номеров, разделеных запятыми:
n1,n2,n3
Но вместо этого пользователь ввел пробел после одного из чисел:
n1,n2, n3

В таком случае при выполнении ассемблером первого прохода он будет собирать все номера (n), но при выполнении второго прохода ассемблер будет рассматривать указанный пробел в качестве конца соответствующей строки (т.е. игнорировать номер n3).

Такие ошибки происходят сравнительно редко, однако если программа пользователя разрушается без явной причины, следует проверить ошибку этого типа после исправления или устранения наиболее вероятных источников ошибки.

КОНЕЦ