АССЕМБЛЕР.
ОПИСАНИЕ ЯЗЫКА.

1. ОБЩИЕ СВЕДЕНИЯ

Язык Ассемблер предназначен для автоматизации программирования на уровне машинных команд.

Основные характеристики языка Ассемблер:

2. СПОСОБ ОПИСАНИЯ ЯЗЫКА

В данном документе используются следующие соглашения:

В данном документе используются следующие обозначения:

<=

меньше или равно

=>

больше или равно

3. СТРУКТУРА ЯЗЫКА

Выполняемая программа на языке Ассемблер состоит из одного или нескольких программных модулей. Максимальное допустимое число программных модулей - шесть.

Каждый программный модуль состоит из последовательности строк - предложений и/или комментариев.

Предложения подразделяются на четыре основных вида: команды, директивы, макрокоманды и оператор прямого присваивания.

Каждой команде Ассемблера в оттранслированной программе соответствует одна команда в машинном коде.

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

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

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

Ассемблер позволяет разбивать исходную программу на несколько программных секций с помощью директив секционирования и управлять распределением памяти для программы во время её связывания.

Полученные после трансляции программы могут быть абсолютными или перемещаемыми. Перемещаемые программы могут быть выполнены в любой области оперативной памяти.

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

3.1. Строки

Исходная программа на языке Ассемблер состоит из последовательности строк.

Формат строки:

[МЕТКА:]  ОПЕРАЦИЯ ОПЕРАНД(Ы)  [;КОММЕНТАРИЙ]<ВК>
          <---ПРЕДЛОЖЕНИЕ--->

или

;комментарий <ВК>

Метка и комментарий являются необязательными компонентами предложения.

Содержимое полей операции и операндов взаимосвязаны. Любое из них может быть опущено в зависимости от содержимого другого.

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

Предложение должно содержать информацию в одном или нескольких из указанных выше полей или во всех четырёх полях.

Разрешаются и пустые строки (пустое предложение).

Предложения могут иметь в поле операндов один операнд или два операнда, например,

CLR R0
MOV #3044,R2

Каждое предложение Ассемблера должно быть размещено на одной строке. Продолжение предложения на следующую строку не разрешается.

Строка может содержать до 13210 символов, не считая символа ВК. Все символы, вводимые сверх этого ограничения, игнорируются, и печатается сообщение об ошибке.

Использование символа ГТ в каждом поле позволяет записать текст исходной программы в формате, удобном для чтения, например:

Поле метки Поле операции Поле операнда(ов) Поле комментария

CHECK:

BIT

#1,R0

; число нечётное?

 

BEQ

EVEN

; нет, чётное, на выход

 

MOV

#-1,ODDFLG

; да, установить признак

EVEN:

RTS

PC

; выход из подпрограммы

3.1.1. Метка

Метка - это определяемое пользователем символическое имя, которому при трансляции присваивается текущее значение счётчика адреса. Значение метки может быть абсолютным или перемещаемым в зависимости от значения счётчика адреса. Метка и соответствующее значение счётчика адреса запоминаются в таблице имён пользователя.

Меткой помечаются строки в программе, к которым осуществляется обращение. Метка в строке должна стоять первой и ограничиваться символом ":" или "::"

Например, если текущее значение счётчика адреса равно 100, в предложении

ABCD: MOV А,В

метке ABCD будет присвоено значение 100.

Если в этом примере значение счётчика адреса перемещаемое, окончательное значение ABCD должно быть K+100, где К - адрес начала перемещаемой секции, в которой определена метка ABCD.

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

ABC: ABD: MASK:     MOV А,В

 меткам ABC, ABD, MASK будет во время трансляции присвоено значение 100.

Если у двух или более меток совпадают первые шесть символов, то при трансляции в листинге печатается сообщение об ошибке "М".

3.1.2. Операция

Поле операции в предложении следует за полем метки и может содержать имя команды, имя макрокоманды или директиву Ассемблера.

Если в поле операции помещено символическое имя команды, Ассемблер транслирует его в машинный код команды.

Если в поле операции помещено имя макрокоманды, Ассемблер при трансляции заменяет макрокоманду соответствующим расширением, которое пользователь определил в начале программы через макроопределение.

Если в поле операции записана директива Ассемблера, она обозначает определённую функцию или действие, которое должно быть выполнено во время трансляции.

Поле операции может быть ограничено пробелом, символом ГТ или любым не буквенно-цифровым символом, который не используется для записи символических имён, например:

MOV А,В - операция MOV ограничена символом ГТ

MOV#A,B - операция MOV ограничена символом #

Если в предложении нет операндов или комментария, последним вводится символ ВК.

Если поле операции остаётся пустым, предложение транслируется как директива Ассемблера .WORD без операндов.

3.1.3. Операнд

Поле операнда в предложении следует за полем операции и может содержать один или более операндов, над которыми должны выполняться действия, определённые операцией.

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

Если предложение содержит несколько операндов, они отделяются друг от друга запятой, пробелом, символом ГТ или символами "<" и ">", в которые заключаются один или несколько операндов.

Операнду может предшествовать операция, метка или другой операнд, после него может следовать комментарий.

Поле операнда заканчивается точкой с запятой, если за ним следует комментарий, или символом ВК, если нет комментария, например:

LABEL: MOV А,В <ВК>

Пробел между символической командой MOV и операндом А ограничивает поле операции и начинает поле операнда, запятая разделяет операнды А и В.

3.1.4. Комментарий

Наличие комментария в предложении необязательно. В поле комментария могут использоваться любые символы терминала за исключением символов ПУС, ЗБ, ВК, ПС, ВТ, ПФ.

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

Комментарии не оказывают никакого влияния на процесс трансляции и на выполнение программы, но они полезны при распечатке программы для последующего анализа, отладки и документирования.

4. ЭЛЕМЕНТЫ ЯЗЫКА

4.1. Алфавит языка

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

4.1.1. Цифры.

Цифра - это один из восьми символов: 0, 1, 2, 3, 4, 5, 6, 7.

Десятичная цифра - это один из десяти символов: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Если не оговорено, то последовательность цифр интерпретируется Ассемблером как число в восьмеричной системе счисления.

4.1.2. Буквы.

Буква - это один из двадцати шести символов: А, В, С, D, Е, F, G, Н, I, J, К, L, М, N, О, P, Q, R, S, Т, U, V, W, X, Y, Z.

4.1.3. Буквенно-цифровые символы.

Буквенно-цифровой символ - это либо буква, либо цифра.

4.1.4. Специальные символы.

Специальный символ - это один из символов, приведённых в табл. 1 и в приложении 1.

Таблица 1

Символ

Название

 

Пробел

:

Двоеточие

=

Равно

%

Процент

#

Признак числа

@

Коммерческое ЭТ

-

Минус

(

Круглая скобка левая

)

Круглая скобка правая

.

Точка

,

Запятая

;

Точка с запятой

Меньше

Больше

+

Плюс

*

Звёздочка

/

Дробная черта

&

Коммерческое И

!

Восклицательный знак

"

Кавычки

'

Апостроф

^

Стрелка вверх

\

Обратная дробная черта

4.1.4.1. Разделительные и ограничительные символы

В табл. 2 приведены допустимые разделительные и ограничительные символы.

Таблица 2

Символ

Определение

Назначение

Пробелы

Один или более пробелов и/или символов ГТ

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

,

Запятая

Допустимый разделитель для выражений и операндов

<>

Парные символы "<" и ">"

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

Символы "<" и ">" могут использоваться в любом месте программы для ограничения выражения, рассматриваемого как терм

^\...\

Конструкция с символом ^

Эта конструкция эквивалентна символам "<" и ">" и обычно используется там, где аргумент уже содержит эти символы

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

При составлении программ необходимо соблюдать следующие правила:

  1. если параметры не содержат разделительные символы, то они отделяются запятыми;
  2. если параметры содержат разделительные символы или пробелы, то они могут быть заключены в символы "<" и ">". Внешняя пара символов "<" и ">" аннулируется при использовании параметра;
  3. если параметр содержит разделительные символы, включая символы "<" и ">", то параметр можно записать, используя конструкцию вида ^\...\, где в качестве ограничителя "\" может быть использован любой символ. Символ "^" и ограничители при использовании параметра опускаются. Следует иметь в виду, что независимо от способа записи каждого из параметров, друг от друга параметры необходимо отделять запятыми.
4.1.4.2. Символы управления форматом

Управление форматом текста программы по горизонтали осуществляется с помощью символов пробел и ГТ. Эти символы не влияют на процесс трансляции, если они не являются составной частью имени, числа, аргумента директивы .ASCII, или, если эти символы не используются в качестве ограничителя операции.

Предложение может быть записано следующим образом:

LABEL:MOV(SP)+,ТАG;выборка данного из стека

или, используя символы управления форматом:

LABEL: MOV (SP)+,TAG ; выборка данного из стека

Использование символов пробел и ГТ в предложениях позволяет сделать программу более удобной для чтения.

Управление форматом листинга программы по вертикали, т.е. размером страницы в N строк, осуществляется вводом кода символа ПФ после N-ой строки. Если код ПФ отсутствует, страница автоматически заканчивается через каждые 58 строк.

4.1.4.3. Символы операций

В табл. 3 приведены символы одноместных операций (операций с одним членом).

Таблица 3

Символ

Операция

 

Пример записи

+

Плюс

+A

положительное значение, эквивалентно А

-

Минус

-А

отрицательное значение А, двоичное дополнение

^

Указатель специальной операции

^F3.0

интерпретируется как однословное число с плавающей запятой 3.0

^C24

интерпретируется как обратный код числа 24

^D127

интерпретируется как десятичное число 12710

^O34

интерпретируется как восьмеричное число 34

^B11000111

интерпретируется как двоичное 11000111

Символы одноместных операций могут быть объединены друг с другом в одном терме, например:

^C^O12
-^O5

В табл. 4 приведены символы двухместных операций (операций с двумя членами).

Таблица 4

Символ

Операция

Пример записи

+

Сложение

А+В

-

Вычитание

А-В

*

Умножение

A*B (результат - 16-разрядное произведение)

/

Деление

A/B (результат - 16-разрядное частное)

&

Логическое И

А&В

!

Логическое ИЛИ

А!В

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

Термы в выражении могут быть сгруппированы и заключены в символы "<" и ">".

Термы, заключённые в символы "<" и ">", вычисляются первыми, остальные операции выполняются последовательно слева направо, например:

.WORD 1+2*3        ; 11 восьмеричное
.WORD 1+<2*3>      ; 7 восьмеричное

4.1.5. Недопустимые символы

Символы считаются недопустимыми в одном из следующих случаев:

  1. символ, который не принадлежит набору символов Ассемблера, всегда является недопустимым и вызывает печать символа "?" в соответствующей позиции текущей строки и печать сообщения об ошибке "1" в листинге, например:
    LABEL ю: MOV А,В

    Так как буква "ю" не входит в набор символов Ассемблера, то вся строка транслируется как оператор .WORD LABEL, а в листинге печатается сообщение об ошибке;

  2. символ, допустимый для использования в Ассемблере, (т.е. символ, принадлежащий набору символов Ассемблера), при нарушении основных положений и синтаксиса языка может быть в контексте интерпретирован как недопустимый, и в листинге печатается сообщение об ошибке "Q".

4.2. Символические имена

4.2.1. Постоянные имена, имена пользователя и имена макрокоманд

В Ассемблере используются символические имена трех видов: постоянные имена, имена пользователя и имена макрокоманд. Соответственно формируется три типа таблиц: таблица постоянных имён, таблица имён пользователя и таблица макроимён.

Таблица постоянных имён содержит постоянные имена и входит в состав транслятора. Постоянными именами являются символические обозначения кодов команд и директив Ассемблера. Эти имена нет необходимости определять перед использованием в исходной программе.

Таблица имён пользователя и таблица макроимён создаются в процессе трансляции исходной программы.

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

Имена макрокоманд добавляются в таблицу макроимён при трансляции по мере того, как они встречаются в исходной программе.

Имена, определяемые пользователем, и имена макрокоманд могут записываться только с помощью букв латинского алфавита, цифр, символа "¤" и точки. Любые другие символы для записи имён не допустимы.

Символы "¤" и "." зарезервированы для имён системных программ.

При формировании имён, определяемых пользователем, и имён макрокоманд необходимо придерживаться следующих правил:

  1. первый символ не должен быть цифрой, за исключением локальных меток;
  2. каждое имя должно быть единственным по первым шести символам;
  3. имя может содержать более шести символов, но седьмой и последующие символы проверяются только на допустимость и не принимаются во внимание при трансляции;
  4. пробелы, символы ГТ и недопустимые символы (например, буквы русского алфавита) нельзя включать в символические имена.

Числовое значение имени зависит от его использования в исходной программе.

Имя, встречающееся в поле операции, может относиться к любому из трех описанных выше видов символических имён. В этом случае для определения значения имени Ассемблер осуществляет поиск имени в таблицах имён в следующем порядке:

  1. таблица макроимён;
  2. таблица постоянных имён;
  3. таблица имён пользователя.

Поиск имён, встретившихся в поле операнда, осуществляется в следующем порядке:

  1. таблица имён пользователя;
  2. таблица постоянных имён.

Предполагается, что Ассемблер не должен обнаружить имя макрокоманды в поле операнда.

Такой порядок просмотра таблиц позволяет переопределить имя, содержащееся в таблице постоянных имён, как имя, определённое пользователем, или как имя макрокоманды. Одно и то же имя может быть использовано для обозначения и макрокоманды и метки.

4.2.1.1. Глобальные и локальные имена

Имена, определяемые пользователем, могут быть локальными и глобальными.

Глобальные имена определяются:

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

Среди локальных имён особое место занимают локальные метки (п. 4.2.3).

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

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

Глобальное имя в программе может не являться меткой, и его значение будет определяться с помощью оператора прямого присваивания как значение выражения. Глобальное имя, определённое как метка, обычно является точкой входа.

4.2.1.2. Внутренние и внешние имена

Глобальные имена делятся на внутренние глобальные и внешние глобальные имена.

Глобальное имя, не определённое в данном объектном модуле, называется внешним. Оно должно быть определено в каком-то другом модуле, для которого уже будет называться внутренним.

Глобальное имя должно быть зафиксировано в качестве аргумента директивы .GLOBL как в объектном модуле, где это имя определено, так и в модуле, где оно используется как внешнее.

Поскольку Ассемблер обеспечивает возможность секционирования программ (п. 7.7), следует также рассматривать две категории глобальных имён:

  1. имена, относящиеся только к текущей секции программы;
  2. имена, используемые и другими программными секциями.

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

4.2.2. Имена регистров

Восемь регистров общего назначения пронумерованы от 0 до 7 и могут быть обозначены в исходной программе как:

%0
%1
%2
%3
%4
%5
%6
%7

Символ % может использоваться с любым термом или выражением для определения номера регистра.

Например,

CLR %3+1 эквивалентно CLR %4

По этой команде очищается регистр 4, тогда как по команде CLR 4 очищается ячейка оперативной памяти 000004.

Рекомендуется использовать символические имена регистров:

R0=%0
R1=%1
R2=%2
R3=%3
R4=%4
R5=%5
SP=%6
PC=%7

Эти имена регистров являются общепринятыми именами и используются во всех стандартных программах.

Регистрам 6 и 7 даны специальные имена вследствие специфики их использования, в то время как регистрам с номерами от 0 до 5 присвоены однотипные имена, чтобы указать, что они являются универсальными регистрами общего назначения.

Стандартные имена регистров можно переопределить, используя директиву .DSABL REG и оператор прямого присваивания. Без указания директивы .DSABL REG переопределять имена регистров не допускается.

4.2.3. Локальные метки

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

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

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

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

Локальные метки записываются в форме: , где N - целое число от 1 до 65535 (десятичное) включительно.

Примеры локальных меток:


35¤
107¤
120¤

Ниже приведён пример листинга исходной программы с использованием локальных меток.

Пример:

1  000000 012700  XCTPRG:  MOV #IMPURE,R0
          000000G
2  000004 005020  1¤:      CLR (R0)+
3  000006 020027           CMP R0,#IMPURT
          000000G
4  000012 001374           BNE 
5
6
7  000014 012700  XCTPAS:  MOV #IMPPAS,R0
          000000G
8  000020 005020  1¤:      CLR (R0)+
9  000022 020027           CMP R0,#IMPPAT
          000000G
10 000026 001374           BNE 
11 000030 000207           RTS PC

Рекомендуется использовать локальные метки от до 29999¤.

Локальные метки от 30000¤ до 65535¤ могут формироваться автоматически в процессе трансляции макрокоманд (п. 8.3.3).

Блок локальных меток состоит из последовательности предложений и должен ограничиваться одним из следующих способов:

  1. начинаться с символической метки и заканчиваться символической меткой;
  2. начинаться с символической метки и заканчиваться одной из директив .PSECT .ASECT .CSECT;
  3. начинаться с символической метки, следующей за директивой .ENABL LSB, и заканчиваться символической меткой или директивой .CSECT, за которыми в том и в другом случае следует директива .DSABL LSB. Подразумевается, что по умолчанию выполняются функции директивы .DSABL LSB.

ПРИМЕЧАНИЕ. Необходимо иметь в виду, что предложение типа LABEL=. , являющееся оператором прямого присваивания, не определяет символическое имя как метку и не может быть ограничителем блока локальных меток.

4.2.4. Имя счётчика адреса

В качестве условного обозначения текущего значения счётчика адреса в Ассемблере используется символ точка (.).

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

Пример:

     A: MOV #.,R0   ; обозначает адрес ячейки с меткой A,
                   ; т.е. адрес данной команды

В начале каждого прохода Ассемблер очищает счётчик адреса программы.

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

.= Выражение.

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

Примеры:

 
        .ASECT
 .=500                 ; значение      счётчика       адреса
                       ; устанавливается       равным    500
                       ; (абсолютное)
FIRST:  MOV .+10,COUNT ; метке FIRST ставится в соответствие
                       ; значение      500     (абсолютное).
                       ; .+10 эквивалентно 510 (абсолютное).
                       ; содержимое ячейки 510  записывается
                       ; в ячейку с меткой count
 .=520                 ; значение       счётчика      адреса
                       ; устанавливается    равным       520
                       ; (абсолютное)
SECOND: MOV .,INDEX    ; значение   метки   second равно 520
                       ; (абсолютное)
                       ; содержимое     ячейки   520,   т.е.
                       ; двоичное    значение        команды
                       ; "MOV .,INDEX" записывается в ячейку
                       ; с меткой INDEX
INDEX: .WORD 0         ;
        .CSECT         ; значение     счётчика        адреса
 .=.+20                ; устанавливается    равным  значению
                       ; счётчика     адреса    перемещаемой
                       ; неименованной  секции плюс 20
THIRD:  .WORD 0        ; значение метки    THIRD   равно  20
                       ; (перемещаемое)

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

С помощью оператора прямого присваивания можно зарезервировать определённую область памяти. Например, если значение текущего адреса равно 1000, оператор .=.+100 резервирует 100 байт оперативной памяти. Следующая команда запишется, начиная с ячейки 1100.

Область памяти можно также резервировать с помощью директив .BLKW и .BLKB (п. 7.5.3).

4.3. Данные

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

4.3.1. Константы

Константа является данным, которое всегда определено и не меняется в процессе выполнения программы.

Константа всегда имеет абсолютное значение. Допускаются следующие виды констант:

Константа без знака или со знаком плюс означает положительное число, а со знаком минус - отрицательное.

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

Система счисления может быть изменена директивой .RADIX.

Если число не определено как десятичное, но содержит цифры 8 и 9, в листинге печатается сообщение об ошибке "N" и число рассматривается как десятичное.

Если число слишком большое для размещения в 16-разрядной ячейке, оно усекается слева, и в листинге печатается сообщение об ошибке "T".

4.3.1.1. Целая константа

Целые константы подразделяются на восьмеричные, десятичные, двоичные.

Восьмеричные константы могут быть заданы в обратном коде.

Восьмеричная константа записывается в виде непустой последовательности цифр 0-7. По умолчанию все константы обрабатываются как восьмеричные.

Восьмеричная константа в исходной программе может задаваться с помощью указателя ^O.

Пример:

2540       ; 2540 восьмеричное число
^O 47      ; 47 восьмеричное число
^O <A+13>  ; А+13 имеет восьмеричное значение

ПРИМЕЧАНИЕ. Символ "^" и буква, указывающая на основание системы счисления, не отделяются друг от друга, в то время, как оба они отделяются от числа пробелом или символом ГТ.

Десятичная константа записывается в виде непустой последовательности цифр 0-9.

Десятичная константа в исходной программе задаётся с помощью точки (.) или указателя ^D.

Пример:

1376.      ; 1376 десятичное число
^D 123     ; 123 десятичное число

Двоичная константа записывается в виде последовательности цифр 0 и 1.

Двоичная константа в исходной программе задаётся c помощью указателя ^B.

Пример:

^B 11000111 ; 11000111 двоичное число

Восьмеричная константа может быть задана в обратном коде с помощью указателя ^C.

Пример:

.WORD ^C 151   ; в ячейке запоминается 177626
4.3.1.2. Вещественная константа

Вещественная константа задаётся с помощью указателя ^F и занимает одно слово. Формат вещественной константы приведён на рисунке.

Формат числа с плавающей запятой:

+N.NE+P

или

-N.NE+P

или

+N.NE-Р

или

-N.NE-P

где

N

- десятичные цифры, определяющие целую и дробную часть числа;

 

Р

- десятичная цифра, определяющая порядок числа (степень 10);

 

E

- основание степени 10;

 

.

- отделяет целую часть числа от дробной.

Формат числа с плавающей запятой, занимающего одно слово

15

14

 

 

 

 

 

 

7

6

 

 

 

 

 

0

 

Порядок

Мантисса

^---- знак числа

Примеры:

 ^F 1.0 = 040200
 ^F -1.0 = 140200
-^F 1.0 = 137600
-^F -1.0 = 037600

ПРИМЕЧАНИЕ. Для записи вещественных констант в два и четыре слова используются директивы .FLT2 и .FLT4 (п. 7.3.7).

4.3.1.3. Символьная константа

Символьная константа может состоять из одного или двух символов КОИ-7.

В качестве значения константы используется 16-разрядный код.

Для преобразования одного символа КОИ-7 в 16-разрядное значение используется апостроф. При этом в младший байт записывается 7-разрядный код символа, а в старший байт - ноль.

Пример:

MOV #'A,R0 ; код символа А (000101) пересылается в R0

Два символа КОИ-7 преобразуются в 16-разрядный код с помощью кавычек. При этом 7-разрядные коды символов записываются в одно слово: код первого символа - в младший байт, код второго символа - в старший байт.

Пример:

MOV #"AB,R0 ; коды символов AB (041101) пересылаются в R0

Символьное данное, состоящее из трех символов, может быть преобразовано в код RADIX-50 с помощью указателя ^R. Результат записывается в одно слово. Если указано более трех символов, то четвёртый и последующие символы игнорируются.

Набор символов, допустимых для преобразования в код RADIX-50, приведён в приложении 1.

Для преобразования последовательности более чем из трех символов в код RADIX-50 может быть использована директива .RAD50 (п. 7.3.5).

Пример:

MOV #^RMAC,R0    ; символы M,A,C преобразуются в код RADIX-50,
                 ; который пересылается в R0

4.3.2. Выражения

Выражение - это терм или несколько термов, соединённых вместе знаками двухместных операций (см. табл. 4). Термом может быть:

Значением выражения является 16-разрядная величина.

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

Отсутствующий терм, выражение или внешнее имя интерпретируется как ноль. Пробелы внутри выражения игнорируются. Пропущенное или недопустимое предложение приводит к прекращению анализа выражения и вызывает печать в листинге сообщений об ошибке "A" и/или "Q".

4.3.2.1. Одноместные и Двухместные операции

По своему назначению операции Ассемблера делятся па одноместные и двухместные.

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

Одноместные операции (см. табл. 3) действуют только на один терм (компонент выражения) и определяют, какое действие необходимо выполнить над данным термом. Терм, которому предшествует одноместная операция, рассматривается как содержащий данную операцию. Плюс, минус и специальные операции относятся к одноместным операциям. Специальные операции - это операции преобразования данных из одной формы представления в другую, записываемые со знаком "^".

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

Двухместные операции имеют одинаковый приоритет.

4.3.2.2. Виды выражений

Выражения могут быть абсолютными, перемещаемыми, внешними и составными перемещаемыми.

Абсолютное выражение определяется как:

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

Перемещаемое выражение определяется как:

Внешним выражением является выражение, которое содержит внешнее имя.

Внешнее выражение определяется как:

Составное перемещаемое выражение содержит несколько перемещаемых или внешних термов.

Выражение является составным перемещаемым, если выполняется любое из следующих условий:

Вычисление перемещаемых, внешних и составных перемещаемых выражений завершается во время связывания программных секций.

ПРИМЕЧАНИЕ. Пробелы внутри выражений могут иметь значение только между символами. Другими словами, выражения

А + В

и

A+B

являются тождественными, но символические имена B17 и В 17 не тождественны.

Примеры:

    .ASECT           ; значение   имени  ABBSYM  абсолютное,
 .=100               ; так как оно определено в   абсолютной
ABBSYM=.             ; секции
    .CSECT MAIN      ; начало     перемещаемой   программной
                     ; секции
    .GLOBL EXTVAL    ; имя EXTVAL является внешним  глобаль-
                     ; ным, оно определено в другом програм-
                     ; мном модуле, его значение будет оста-
                     ; ваться неизменным до связывания
BEGSYM: .BLKW 4      ; значения имён BEGSYM и ENDSYM являют-
    .ASCII /ABCD/    ; ся   перемещаемыми,  так  как  адрес,
    .EVEN            ; начиная с которого будет  загружаться
                     ; программная  секция с именем    MAIN,
    ENDSYM=.         ; будет  определен  лишь    во    время
                     ; связывания
SIZE=ENDSYM-BEGSYM   ; значение  имени  SIZE  становится уже
                     ; известным (оно равно 1210) во время
                     ; трансляции и является абсолютным
RELEXP=ENDSYM-BEGSYM+. ; Значение имени RELEXP (равное .+12)
                       ; Является  перемещаемым
EXTEXP:.WORD EXTVAL+4; выражение EXTVAL+4 является   внешним
                     ; глобальным, так    как   имя   EXTVAL
                     ; определено   в   другом   программном
                     ; модуле
CHARA='A             ; значение  имени  CHARA,    равное 'A,
                     ; является абсолютным

4.4. Оператор прямого присваивания

Оператор прямого присваивания вычисляет выражение и присваивает полученное значение символическому имени.

Формат оператора прямого присваивания:

символическое имя = выражение

или

символическое имя == выражение

или

символическое имя =: выражение

или

символическое имя ==: выражение

Символическое имя принимает абсолютное или перемещаемое значение в зависимости от определяющего его выражения.

Выражение в операторе прямого присваивания может содержать только один уровень ссылки вперёд и не должно содержать ссылку на внешнее имя.

Операторы прямого присваивания, содержащие символы "==" и "==:", определяют имя как глобальное.

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

Значение символического имени может быть переопределено последующим оператором прямого присваивания, если в операторе прямого присваивания используются символы "=" и "==". Если в операторе прямого присваивания используются символы "=:" или "==:", любая попытка изменить значение символического имени вызывает печать в листинге сообщения об ошибке "М".

При использовании оператора прямого присваивания должны соблюдаться следующие правила:

  1. символы "=", "==", "=:", "==:"отделяют имя от выражения, значение которого присваивается имени;
  2. оператор прямого присваивания обычно помещается в поле операции, перед ним может быть метка, а после него - комментарий;
  3. одним оператором прямого присваивания может быть определено только одно имя;
  4. допускается только один уровень ссылки вперёд, например,
    X=Y
    Y=1
  5. оператор прямого присваивания, определяющий глобальное имя, не должен содержать ссылку вперёд.

5. ПЕРЕМЕЩЕНИЕ И СВЯЗЫВАНИЕ

Результатом работы Ассемблера является объектный модуль, который должен быть обработан редактором связей до его загрузки и выполнения.

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

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

Если выражение перемещаемое, редактор связей прибавляет базовый адрес соответствующей перемещаемой программной секции к величине выражения, определённого Ассемблером при трансляции программы.

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

Все слова, которые должны быть модифицированы, при распечатке листинга программы отмечаются символами "'", "G" или "С":

"'"

- требуется простое перемещение;

"G"

- к абсолютной части выражения должно быть прибавлено значение внешнего символического имени;

"С"

- для фиксирования выражения редактор связей должен выполнить анализ сложного перемещения.

Пример.

005065  CLR   RELOC(R5) ; предполагается, что значение имени
000040'                 ; RELOC     является   перемещаемым.
                        ; редактор связей прибавит   к  нему
                        ; смещение от перемещения модуля
005065  CLR  EXTERN(R5) ; внешнему глобальному имени  EXTERN
000000G                 ; при    трансляции    ставится    в
                        ; соответствие    значение     нуль.
                        ; действительное    значение   будет
                        ; определено редактором связей
005065  CLR EXTERN+6(R5); абсолютная    часть      выражения
000006G                 ; (000006)     будет  прибавлена   к
                        ; значению   внешнего  имени  EXTERN
                        ; в процессе связывания
005065  CLR -<EXTERN+RELOC>(R5)      ;выражение     является
000000C                 ; составным перемещаемым,  так   как
                        ; оно содержит глобальное имя EXTERN
                        ; и перемещаемый терм,   взятые   со
                        ; знаком минус

6. КОМАНДЫ

Команды Ассемблера делятся на безадресные, одноадресные и двухадресные. Безадресные команды содержат только символическое имя команды. Одноадресные и двухадресные команды содержат символическое имя команды, метод(ы) адресации, регистр(ы) общего назначения и/или адрес

Набор команд, допустимых в языке Ассемблер, приведён в приложении 3.

6.1. Методы адресации

Счётчик команд PC (R7) является одним из восьми регистров общего назначения и всегда содержит адрес следующего слова, т.е. адрес следующей команды, которую нужно выполнить, или адрес второго или третьего слова текущей команды.

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

Например, если команда использует индексный метод адресации, то после выборки команды и увеличения PC на 2 процессор снова обращается к памяти за индексным словом, после чего ещё раз увеличивает на 2 содержимое PC.

Введём следующие обозначения:

  1. E - выражение, как оно определено выше (см. п. 4.3.2);
  2. R - выражение для регистра. Это любое выражение, содержащее терм, которому предшествует символ %, или имя, предварительно присвоенное такому терму.

    Примеры:

    R0=%0     ; регистр общего назначения 0
    R1=%1     ; регистр общего назначения 1
    R2=%2     ; регистр общего назначения 2
  3. ER - выражение для идентификации регистра, т.е. выражение, значение которого заключено в пределах от 0 до 7;
  4. А - выражение для указания метода адресации, занимающего 6-разрядное поле операнда;

Выражение А может быть представлено термами, обозначенными: E, R, ER. В примерах для иллюстрации одноадресных команд используется команда CLR, для двухадресных - команда MOV.

Методы адресации приведены в приложении 4.

6.1.1. Регистровый метод

Формат: R

Регистр содержит операнд

Пример:

CLR R3 ; очистить регистр 3

6.1.2. Косвенно-регистровый метод

Формат: @R или (ER)

Регистр содержит адрес операнда

Примеры:

CLR   @R1   ;очистить ячейку, адрес которой находится
CLR   (R1)  ;в R1
CLR   (%1)

6.1.3. Автоинкрементный метод

Формат: (ER)+

Регистр содержит адрес операнда. Содержимое регистра после его использования как адреса операнда автоматически увеличивается на 1 или 2.

Примеры:

CLR   (R0)+    ; каждая из этих команд очищает ячейку по
CLR   (R4)+    ; адресу, содержащемуся в указанном
CLR   (R2)+    ; регистре 0, 4, 2, и затем увеличивает
               ; содержимое этого регистра на 2

6.1.4. Косвенно-автоинкрементный метод

Формат: @(ER)+

Регистр содержит указатель адреса операнда, т.е. адрес адреса операнда. Содержимое регистра после его использования как указателя адреса операнда автоматически увеличивается на 2.

Пример:

CLR   @(R3)+   ; регистр 3 содержит указатель адреса ячейки,
               ; которая очищается. Затем содержимое
               ; регистра 3 увеличивается на 2

6.1.5. Автодекрементный метод

Формат: -(ER)

Регистр содержит адрес операнда. Содержимое регистра автоматически уменьшается на 1 или 2, а затем используется как адрес операнда.

Примеры:

CLR   -(R0)    ;содержимое регистров 0, 3, 2 уменьшается на
CLR   -(R3)    ;2 перед использованием каждого из них в
CLR   -(R2)    ;качестве адреса операнда

6.1.6. Косвенно-автодекрементный метод

Формат: @-(ER)

Регистр содержит указатель адреса операнда. Содержимое регистра автоматически уменьшается на 2, а затем используется как указатель адреса операнда.

Пример:

CLR   @-(R2)   ; содержимое регистра 2 уменьшается перед
               ; использованием его как указателя адреса
               ; операнда

6.1.7. Индексный метод

Формат: E(ER)

Значение выражения E (индексное слово) запоминается во втором или третьем слове команды. Исполнительный адрес операнда вычисляется как сумма значений E и содержимого регистра ER.

Примеры:

CLR   X+2(R1)   ; исполнительный адрес равен Х+2 плюс
                ; содержимое регистра 1
MOV   R0,-2(R3) ; исполнительный адрес равен -2 плюс
                ; содержимое регистра 3

6.1.8. Косвенно-индексный метод

Формат: @E(ER)

Значение выражения E и содержимое регистра, определяемое выражением ER, складываются и сумма используется как указатель адреса операнда.

Пример:

CLR   @114(R4) ; если регистр 4 содержит значение 100 и
               ; содержимое ячейки 214 равно 2000, то ячейка
               ; с адресом 2000 очищается

6.1.9. Непосредственный метод

Формат: #Е

Операнд Е запоминается во втором или третьем слове команды. Непосредственный метод формируется как автоинкрементный метод адресации с использованием счётчика команд, т.е. PC.

Пример:

MOV   #100,R0  ; занести 100 в регистр 0

Символ # используется как указатель непосредственного метода адресации. Команда MOV #100,R0 транслируется как двухсловная команда, операнд помещается во втором слове команды: (при использовании FPP непосредственный операнд транслируется как число с плавающей точкой)

012703
000100

Непосредственно перед тем как эта команда будет выбрана и исполнена, PC указывает на первое слово команды. Процессор выбирает первое слово и увеличивает PC на 2. Метод адресации второго операнда - 27 (автоувеличение PC). Таким образом, PC используется как указатель операнда (второе слово команды) перед тем, как его содержимое будет увеличено на 2, т.е. будет содержать адрес следующей команды.

6.1.10. Абсолютный метод

Формат: @#Е

Абсолютный адрес операнда, задаваемый выражением @#A, запоминается во втором или третьем слове команды. Это достигается использованием косвенно-автоинкрементного метода адресации применительно к счётчику команд.

Примеры:

MOV   @#100,R0     ; запомнить содержимое ячейки 100 в
                   ; регистре 0
CLR   @#Х          ; очистить ячейку, адрес которой равен
                   ; значению символа X

6.1.11. Относительный метод

Формат: Е

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

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

Примеры:

CLR   100      ; очистить ячейку с адресом 100
MOV   100,R3   ; занести содержимое ячейки 100 в регистр 3

Используя обозначение счётчика адреса и счётчика команд, второй операнд можно записать в следующем виде:

MOV   100-.-4(PC),R3

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

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

Например, если оператор "MOV 100,R3" помещён по абсолютному адресу 20, то в результате трансляции получим:

000020 016703
000022 000054

При выполнении команды "MOV 100,R3" будет происходить следующее:

  1. выборка команды из ячейки 20;
  2. увеличение содержимого PC на 2 (PC=22), т.е. получение адреса ячейки, содержащей индексное слово;
  3. выборка индексного слова из ячейки с адресом 22;
  4. увеличение содержимого PC на 2 (PC=24) и исполнение команды, при котором адрес операнда источника будет определён как сумма содержимого PC и индексного слова, т.е. 24 + 54=100.

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

6.1.12. Косвенно-относительный метод

Формат: @Е

Указатель адреса операнда задаётся с помощью PC и индексного слова. Этот метод адресации аналогичен относительному методу адресации, только сформированный адрес является указателем адреса операнда.

Это достигается использованием косвенно-индексного метода адресации применительно к PC.

Пример:

MOV   @X,R0    ; занести в регистр 0 содержимое ячейки,
               ; адрес которой находится в X

6.1.13. Форматы методов адресации

Методы адресации, приведённые в табл. 5, не увеличивают длину команды.

Таблица 5

Формат метода адресации

Код метода адресации

Наименование

R

0N

Регистровый

@R или (ER)

1N

Косвенно-регистровый

(ER)+

2N

Автоинкрементный

@(ER)+

3N

Косвенно-автоинкрементный

-(ER)

4N

Автодекрементный

@-(ER)

5N

Косвенно-автодекрементный

Методы адресации, приведённые в табл. 6, увеличивают длину команды на одно слово.

Таблица 6

Формат метода адресации

Код метода адресации

Наименование

E(ER)

6N

Индексный

@Е(ER)

7N

Косвенно-индексный

#Е

27

Непосредственный

@#Е

37

Абсолютный

Е

67

Относительный

@Е

77

Косвенно-относительный

ПРИМЕЧАНИЯ:

  1. В графе "Код метода адресации" N - один из регистров общего назначения.
  2. Последние четыре метода адресации в качестве регистра общего назначения используют счётчик команд.
  3. С помощью директивы .ENABL AMA можно в процессе трансляции заменить относительный метод адресации на абсолютный метод адресации в командах программы (п. 7.2.1).

6.2. Адресация в командах ветвления

Команды ветвления вызывают передачу управления по адресу, являющемуся суммой текущего содержимого PC и смещения, умноженного на 2.

За текущее содержимое PC берётся адрес следующей команды.

Смещение записывается в команде ветвления в разрядах 0-7 и указывает после умножения на 2, на сколько слов нужно перейти от ячейки, адрес которой в данный момент содержится в PC. Седьмой разряд смещения является знаковым. Если он установлен, то смещение отрицательное и ветвление происходит в направлении уменьшения адресов, а если этот разряд очищен, то смещение положительное и ветвление происходит в направлении увеличения адресов программы.

Исполнительный адрес в команде ветвления аппаратно вычисляется следующим образом:

  1. формируется 16-разрядное слово, младший байт которого является смещением, а разрядам 15-8 присваивается значение знакового разряда смещения;
  2. полученное слово умножается на 2, т.е. образуется смещение, выраженное в словах, а не в байтах;
  3. результат складывается с содержимым PC для формирования исполнительного адреса.

Ассемблер выполняет обратную операцию для формирования смещения в байтах относительно заданного адреса.

При использовании команд ветвления необходимо следить за тем, чтобы не было:

В случае нарушения одного из этих условий в соответствующей позиции текущей строки будет напечатано сообщение об ошибке "A" и установлено смещение 377 (восьмеричное).

6.3. Адресация в системных командах EMT и TRAP

В командах EMT и TRAP старший байт слова содержит код команды, а младший байт предназначен для передачи информации драйверам внутренних прерываний.

Если EMT (или TRAP) сопровождается выражением, то при трансляции значение этого выражения запоминается в младшем байте слова. Если значение выражения превышает значение 3778, оно усекается до 8 бит и печатается сообщение об ошибке "T".

7. ДИРЕКТИВЫ

В данном разделе описываются директивы языка Ассемблер (см. приложение 5), подразделяющиеся на:

  1. директивы управления листингом;
  2. директивы режима трансляции;
  3. директивы задания данных;
  4. директива управления системой счисления;
  5. директивы управления счётчиком;
  6. директива окончания;
  7. директивы секционирования;
  8. директивы описания имён;
  9. директивы условной трансляции;
  10. директивы управления файлами.

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

Директивы управления листингом управляют содержанием, форматом и формированием страниц листинга, выдаваемых на терминал и построчно-печатающее устройство.

К директивам управления листингом относятся:

.LIST
.NLIST
.TITLE
.SBTTL
.IDENT
.PAGE
.REM

7.1.1. Директивы .LIST и .NLIST.

Директивы .LIST и .NLIST используются для управления печатью определённых аргументами полей листинга: - .LIST разрешить печать, .NLIST - запретить печать.

Формат:

.LIST [А]
.NLIST [А]

где

А

- один или несколько аргументов (табл. 7), разделённых запятыми, пробелами или символами ГТ.

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

Счётчик уровня печати увеличивается на 1 по директиве .LIST и уменьшается на 1 по директиве .NLIST. Первоначальное значение счётчика уровня печати равно нулю.

Основное назначение счётчика уровня печати - обеспечить выборочную распечатку макрорасширений, при этом значение счётчика уровня печати при выходе должно совпадать с тем, каким оно было до обращения к макрокоманде.

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

Таблица 7

Символические аргументы директив .LIST и .NLIST

Аргумент

Действие по умолчанию

Функция

SEQ

Печать

Управление печатью порядковых номеров строк исходной программы. Строки исходной программы нумеруются последовательно, начиная с 1.

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

LOC

-"-

Управление печатью значений счётчика адреса. Директива .NLIST LOC запрещает печать значений счётчика адреса. Поле счётчика адреса не выделяется с помощью пробелов и происходит выравнивание слева всех последующих полей листинга

BIN

-"-

Управление печатью объектных кодов в восьмеричном виде. Директива .NLIST BIN запрещает печать указанных кодов, происходит выравнивание слева всех последующих полей листинга

BEX

-"-

Управление печатью объектных кодов в восьмеричном виде, расположенных на нескольких строках. Директива .NLIST BEX запрещает печать указанных кодов, кроме кодов первой строки

SRC

-"-

Управление печатью предложений исходной программы

COM

-"-

Управление печатью комментария. Директива .NLIST COM сокращает время распечатки и объём листинга в случае, когда комментарии не требуются

MD

-"-

Управление печатью макроопределений и областей повторений

MC

-"-

Управление печатью макрокоманд

ME

Печать запрещена

Управление печатью макрорасширений и расширений областей повторений

MEB

-"-

Управление печатью предложений макрорасширений, порождающих объектные коды

LD

-"-

Управление действием директив .LIST и .NLIST

без аргументов

CND

Печать

Управление печатью блоков условной трансляции с невыполненными условиями

TOC

-"-

Управление печатью оглавления

SYM

-"-

Управление печатью таблицы имён и таблицы перекрёстных ссылок

TTM

-"-

Управление форматом печати объектных кодов, таблицы имён и таблицы перекрёстных ссылок

ПРИМЕЧАНИЕ. Директива .NLIST SEQ, LOC, BIN, SRC запрещает печать всех полей листинга, при этом пустая строка игнорируется.

Директивы .LIST и .NLIST с аргументами не изменяют значение счётчика уровня печати, однако данные директивы могут использоваться для переопределения действия директив управления печатью листинга.

Пример:

      .MACRO XX
         .
         .
         .
     .LIST            ; печатать следующую строку
X=.
     .NLIST           ; не печатать оставшуюся часть
         .            ; макрорасширения
         .
         .
     .NLIST ME        ; не печатать макрорасширение
     XX
X=.
 

Управлять печатью листинга можно с помощью переключателей командной строки Ассемблера (см. [1]). Действия переключателей аналогичны действию директив .LIST, .NLIST и позволяют изменить действия этих директив, используемых в исходной программе.

7.1.2. Директива .TITLE.

Директива .TITLE используется для присваивания имени объектному модулю.

Формат:

.TITLE С         ; комментарий

где

С

- имя объектного модуля.

Имя может состоять из шести символов, допустимых в коде RADIX-50. Пробелы, следующие за директивой .TITLE, в имя не включаются. Символы, следующие за первыми шестью, проверяются на соответствие алфавиту языка, но не включаются в имя объектного модуля, но будут включаться вместе с именем объектного модуля в заголовок каждой страницы листинга.

Если в исходной программе встречается несколько директив .TITLE, то объектному модулю присваивается имя, указанное в последней директиве .TITLE. Если директива .TITLE отсутствует, то объектному модулю Ассемблер присваивает имя .MAIN.

7.1.3. Директива .SBTTL.

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

Формат:

.SBTTL С

где

С

 - текст, который печатается в оглавлении и в заголовке листинга.

В оглавление листинга включаются порядковый номер строки, номер страницы и текст, сопровождающий каждую директиву .SBTTL. Текст, заданный в .SBTTL, печатается в заголовке на каждой странице листинга до появления следующей директивы .SBTTL, изменяющей заголовок страницы.

ПРИМЕЧАНИЕ. Печать оглавления запрещается по директиве .NLIST ТОС.

Пример:

.SBTTL CONDITIONAL ASSEMBLIES

Текст "CONDITIONAL ASSEMBLIES" будет печататься в заголовке каждой страницы листинга.

7.1.4. Директива .IDENT.

Директива .IDENT используется для дополнительного обозначения объектного модуля, создаваемого Ассемблером.

Формат:

.IDENT /C/

где

С

- последовательность не более чем из шести символов, допустимых в коде RADIX-50;

 

/ /

- ограничители (любые символы за исключением символов ";", "=", "<" )

В дополнение к имени, присвоенному объектному модулю по директиве .TITLE (см. п. 7.1.2), указывается последовательность символов, допустимых в коде RADIX-50, которая может быть использована для указания номера версии программы.

ПРИМЕЧАНИЯ:

1. Номер версии программы, заданный в директиве .IDENT, упаковывается в код RADIX-50 и записывается в словарь глобальных имён объектного модуля. Номер версии печатается в карте загрузки и в листинге каталога библиотеки.

2. Принимается во внимание только первая директива .IDENT в исходной программе.

Пример:

.IDENT /V05A/

Директива .IDENT определяет номер версии программы V05A.

7.1.5. Директива .PAGE.

Директива .PAGE вызывает печать следующего за ней текста с новой страницы листинга.

Формат:

.PAGE

Если директива .PAGE используется в макроопределении, то во время трансляции макроопределения она игнорируется, но при распечатке макрорасширения происходит формирование новой страницы листинга.

Формирование страницы листинга осуществляется не только по директиве .PAGE, но если счётчик строк станет равным 58 или в исходной программе встретится символ ПФ. Если символ ПФ появляется в макроопределении, то формирование страницы листинга осуществляется во время трансляции макроопределения. Формирование страницы листинга осуществляется также по началу файла, в том числе при директиве .INCLUDE.

7.1.6. Директива .REM.

Директива .REM позволяет ввести комментарий в исходную программу без использования символа ";". Комментарий может содержать любое число строк.

Формат:

.REM /Kоммент/

где

коммент

- текст комментария;

 

/ /

- ограничители (любые допустимые символы).

Пример:

.TITLE REMARK EXAMPLE
 .REM &
 COMMENT&
 CLR PC
 .END

7.2. Директивы режима трансляции.

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

К директивам режима трансляции относятся:

.ENABL
.DSABL
.CROSS
.NOCROSS

7.2.1. Директивы .ENABL и .DSABL.

Директивы .ENABL и .DSABL используются для управления функциями трансляции: .ENABL - разрешить выполнение функции, .DSABL - запретить выполнение функции.

Формат:

.ENABL A
.DSABL A

где

A

- один или несколько символических аргументов (табл. 8), разделённых запятыми, пробелами или символами ГТ.

Таблица 8
СИМВОЛИЧЕСКИЕ АРГУМЕНТЫ ДИРЕКТИВ .ENABL и .DSABL

Аргумент

Действие по умолчанию

Функция

ABS

Запрещение

Вывод модуля в абсолютном двоичном формате

AMA

-"-

Замена относительного метода адресации (67) на абсолютный (37)

CRF

Разрешение

Включение символических имён, используемых в исходном модуле, в таблицу перекрёстных ссылок Функция имеет смысл в случае, если в командной строке транслятора задан переключатель /C арг

FPT

Запрещение

Усечение (.ENABL FPT) или округление (.DSABL FPT) представление чисел с плавающей запятой

LC

Разрешение

Преобразование вводимых символов КОИ-7 нижнего регистра в символы верхнего регистра. Если эта функция запрещена, то весь текст вводится без преобразования

LCM

Запрещение

Использование символов верхнего/нижнего регистра в директивах .IF IDN и .IF DIF

LSB

-"-

Открытие или закрытие блока локальных меток

MCL

-"-

Поиск неопределённых символических имён в макробиблиотеке пользователя и системной макробиблиотеке

PNC

Разрешение

Включение объектных кодов в объектный модуль

REG

-"-

Переопределение имён регистров, назначенных по умолчанию

GBL

Запрещение

Обработка неопределённых символических имён как внешних

 

Блок локальных меток обычно устанавливается при появлении символической метки, директивы .PSECT или директивы .RESTORE.

Директива .ENABL LSB устанавливает новый блок локальных меток, который оканчивается при появлении директивы .DSABL LSB

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

Попытка использовать локальные метки, определённые в другой программной секции, вызывает печать в листинге сообщения об ошибке "P". В случае изменения на втором проходе трансляции значения метки будет напечатано сообщение об ошибке "P".

7.2.2. Директивы .CROSS и .NOCROSS.

Директивы .CROSS и .NOCROSS управляют печатью и содержанием таблицы перекрёстных ссылок: .CROSS - разрешить указанное действие, .NOCROSS - запретить указанное действие.

Формат:

.CROSS [S1, S2,..., SN]
.NOCROSS [S1, S2,..., SN]

где

S1,S2,...,SN

- символические имена, разделённые запятыми, пробелами или символами ГТ.

Директивы используются с переключателем командной строки /C[R] или /CROSS. По умолчанию таблица перекрёстных ссылок содержит все определения и обращения ко всем символическим именам в модуле.

Директива .NOCROSS (эквивалентна .DSABL CRF) без аргументов запрещает включение символических имён в таблицу перекрёстных ссылок до появления директивы .CROSS без аргументов.

Директива .NOCROSS со списком аргументов запрещает включение указанных имён в таблицу перекрёстных ссылок. Директива .CROSS со списком аргументов разрешает включение указанных имён в таблицу перекрёстных ссылок.

Если таблица перекрёстных ссылок всех символов в модуле запрещена по директиве .NOCROSS без аргументов, директива .CROSS со списком аргументов не будет иметь действие до повторного разрешения таблицы перекрёстных ссылок по директиве .CROSS без аргументов.

Директива .CROSS без списка аргументов эквивалентна директиве .ENABL CRF, а директива .NOCROSS без списка аргументов эквивалентна директиве .DSABL CRF.

Примеры:

1)            .NOCROSS
     LABEL1:  MOV LOC1,LOC2
              .CROSS

В данном примере имя LABEL1 и ссылка на LOC1 и LOC2 не включены в таблицу перекрёстных ссылок.

2)            .NOCROSS
     LABEL2:  MOV LOC1,LOC2
              .CROSS LOC1

В данном примере определение и ссылка на LOC2 включены в таблицу перекрёстных ссылок, но ссылка на LOC1 не включена в таблицу перекрёстных ссылок.

7.3. Директивы задания данных.

Директивы задания данных используются для записи данных в различных видах.

К директивам задания данных относятся:

.BYTE
.WORD
.ASCII
.ASCIZ
.RAD50
.PACKED
.FLT2
.FLT4

7.3.1. Директива .BYTE.

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

Формат:

.BYTE [E1,...,EN]

где

E1,...,EN

- одно или несколько допустимых выражений, разделённых запятыми.

Каждое выражение имеет 8-разрядное значение.

Операнды директивы .BYTE вычисляются сначала как выражения длиной в одно слово, а затем усекаются до восьми младших двоичных разрядов. Шестнадцатиразрядное значение указанного в директиве выражения должно иметь в старшем байте (который отбрасывается) либо все нули, либо все единицы, в противном случае в листинге печатается сообщение об ошибке "T".

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

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

Примеры:

1)        SAM=5
     .=410
          .BYTE ^D48,SAM ; 060 (ВОСЬМЕРИЧНЫЙ КОД ДЕСЯТИЧНОГО
                         ; 48) ЗАПОМИНАЕТСЯ В ЯЧЕЙКЕ 410
          .PSECT         ; ПЕРЕМЕЩАЕМАЯ ПРОГРАММНАЯ СЕКЦИЯ
     A:
          .BYTE A        ; A ИМЕЕТ ОТНОСИТЕЛЬНОЕ ЗНАЧЕНИЕ
2)   .=420
          .BYTE ,,,      ; ЗНАЧЕНИЕ 0 ЗАПОМИНАЕТСЯ В ЯЧЕЙКАХ
                         ; 420, 421, 422, 423

7.3.2. Директива .WORD.

Директива .WORD используется для записи данных (операндов) в последовательно расположенных словах объектного модуля.

Формат:

.WORD [E1,...,EN]

где

E1,...,EN

- одно или несколько допустимых выражений, разделённых запятыми.

Каждое выражение имеет 16-разрядное значение. Директива .WORD без аргументов или директива .WORD, за которой следуют запятые, записывает нули в последовательные слова.

Примеры:

1)        SAL=0
     .=500
          .WORD 177535,.+4,SAL ; ЗНАЧЕНИЯ   177535, 506 И 0
                               ; ЗАПОМИНАЮТСЯ В ЯЧЕЙКАХ 500,
                               ; 502 И 504 СООТВЕТСТВЕННО
2)   .=500
          .WORD ,5,            ; ЗНАЧЕНИЯ    0,   5   И   0
                               ; ЗАПОМИНАЮТСЯ В ЯЧЕЙКАХ 500,
                               ; 502 И 504 СООТВЕТСТВЕННО

7.3.3. Директива .ASCII.

Директива .ASCII используется для записи последовательности символов в коде КОИ-7. Формат:

.ASCII /C1/.../CN/

где

C1,...,CN

- последовательности символов КОИ-7;

 

/ /

- ограничители (любые символы, за исключением символов, указанных в операнде директивы).

Непечатные символы могут записываться в операнде директивы .ASCII только путём ограничения кода каждого символа "<" и ">". Символы "<" и ">", используемые внутри последовательности символов, не являются ограничителями.

Пример:

 .ASCII /АДРЕС/           ; коды   символов   А, Д, Р, Е, С
                          ; запоминаются в последовательных
                          ; байтах
 .ASCII /ABC/<15><12>/DEF/; коды символов A,B,C,ВК,ПС,D,E,F
                          ; запоминаются в последовательных
                          ; байтах
 .ASCII /A<15>B/          ; коды  символов A, <, 1, 5, >, B
                          ; запоминаются в последовательных
                          ; байтах
 .ASCII <15>/ABC/         ; код 15  и коды символов A, B, C
                          ; запоминаются в последовательных
                          ; байтах

Следует соблюдать осторожность при использовании символов ";", "<" и "=" в качестве ограничителей в директиве .ASCII, так как эти символы имеют специальное назначение.

Пример:

 .ASCII ;ABC;/DEF/        ; коды  символов A, B, C, D, E, F
                          ; запоминаются в последовательных
                          ; байтах
 .ASCII /ABC/;DEF;        ; коды символов A,B,C запоминаются
                          ; в последовательных байтах,
                          ; символы D, E, F, ;
                          ; рассматриваются как комментарий
 .ASCII /ABC/=DEF=        ; коды символов  A, B, C, D, E, F
                          ; запоминаются в последовательных
                          ; байтах
 .ASCII =DEF=             ; воспринимается    как  оператор
                          ; прямого присваивания .ASCII=DEF

7.3.4. Директива .ASCIZ.

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

Формат:

.ASCIZ /C1/.../CN/

где

C1,...,CN

- последовательности символов КОИ-7;

 

/ /

- ограничители (любые символы, за исключением символов, указанных в операнде директивы).

Пример:

            CR=15
            LF=12
     HELLO: .ASCIZ <CR><LF>/СООБЩЕНИЕ/<CR><LF>
            .EVEN
               .
               .
               .
            MOV #HELLO,R1
            MOV #LINBUF,R2
     10¤:   MOVB (R1)+,(R2)+
            BNE 10¤
               .
               .
               .

7.3.5. Директива .RAD50.

Директива .RAD50 используется для упаковки последовательности символов в код RADIX-50. Каждые три символа упаковываются в одно слово.

Формат.

.RAD50 /C1/.../CN/

где

C1,...,CN

- упаковываемые символы, допустимые в RADIX-50 (табл. 9);

 

/ /

- ограничители (любые символы, за исключением символов, указанных в операнде директивы).

Если в одно слово упаковывается менее чем три символа, то недостающие символы дополняются пробелами.

В директиве .RAD50 для записи кодов символов должны использоваться символы "<" и ">".

Таблица 9

Символ

Код RADIX-50

Пробел

0

А - Z

1 - 32

¤

33

.

34

Не определён

35

0 - 9

36 - 47

Код RADIX-50 для трех последовательно расположенных символов C1, C2, C3 определяется по формуле:

код RADIX-50 = ((C1*508)+C2)*508+C3

Например, последовательность символов АВС в коде RADIX-50 имеет значение:

((1*508)+2)*508+3=32238

Примеры:

 .RAD50 /ABC/     ; упаковка ABC в одно слово
 .RAD50 /AB/      ; упаковка AB и пробела в одно слово
 .RAD50 /ABCD/    ; упаковка ABC в первое слово, D и двух
                  ; пробелов во второе слово
 .RAD50 /AB/<35>  ; упаковка 3255 в одно слово
 CHR1=1
 CHR2=2
 CHR3=3
    .
    .
    .
 .RAD50 <CHR1><CHR2><CHR3>  ; эквивалентно .RAD50 /ABC/

7.3.6. Директива .PACKED.

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

Формат:

.PACKED DS [,C]

где

DS

- последовательность десятичных цифр (до 3110);

 

С

- символическое имя, принимающее значение, равное числу цифр в заданной последовательности

Последовательность десятичных цифр может иметь знак, но не должна использоваться как число. Каждая цифра в заданной последовательности имеет значение от 0 до 9

Примеры:

 .PACKED -12,PACK  ; PACK получает значение 2
 .PACKED +500      ; упаковать 500
 .PACKED 0         ; упаковать 0
 .PACKED -0,SUM    ; sum получает значение 1
 .PACKED 1234E6    ; недопустимая упаковка.  E6 будет
                   ; рассматриваться как переменная и
                   ; принимать значение 4

7.3.7. Директивы .FLT2 и .FLT4.

Директивы .FLT2 и .FLT4 используются для записи десятичных чисел в форме с плавающей запятой

Формат

.FLT2 A1,...,AN
.FLT4 A1,...,AN

где

A1,...,AN

- одно или несколько десятичных чисел, разделённых запятой.

По директиве .FLT2 каждое число записывается с одинарной точностью - в два слова (рис. 1), по директиве .FLT4 - с двойной точностью - в четыре слова (рис. 2).

Формат числа с плавающей запятой, занимающею два слова

31

30

 

23

22

 

0

 

Порядок

Мантисса

^ --- Знак числа

Рис. 1

Формат числа с плавающей запятой, занимающего четыре слова

63

62

 

55

54

 

0

 

Порядок

Мантисса

^ --- Знак числа

Рис. 2

7.4. Директива управления системой счисления: .RADIX.

Константы и значения выражений обрабатываются Ассемблером в восьмеричной системе счисления.

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

Формат:

.RADIX [N]

где

N

- выражение, задающее основание системы счисления (2, 8, 10). Оно вычисляется в десятичной системе счисления, независимо от ранее установленного основания.

Если аргумент в директиве не задан, то по умолчанию предполагается N=8. Директива .RADIX сохраняет действие до появления другой директивы .RADIX.

В макроопределениях для задания системы счисления отдельных данных рекомендуется использовать специальные операции (см. п. 4.3.1).

Пример:

     .RADIX 10  ; УСТАНАВЛИВАЕТСЯ  ДЕСЯТИЧНАЯ  СИСТЕМА
                ; СЧИСЛЕНИЯ
     .RADIX     ; УСТАНАВЛИВАЕТСЯ ВОСЬМЕРИЧНАЯ СИСТЕМА
                ; СЧИСЛЕНИЯ

7.5. Директивы управления счётчиком.

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

К директивам управления счётчиком относятся:

.EVEN
.ODD
.BLKB
.BLKW
.LIMIT

7.5.1. Директива .EVEN.

Директива .EVEN используется для установления чётного значения счётчика адреса путем добавления единицы в случае его нечётности.

Формат:

.EVEN

Директива .EVEN применяется обычно после использования директив Ассемблера, приводящих к нечётному значению счётчика адреса: .ASCII, .ASCIZ, .BYTE.

Если текущее значение счётчика адреса чётное, то директива .EVEN не выполняет никакого действия.

Пример:

.ASCII /Текст/
.EVEN
.WORD XYZ

7.5.2. Директива .ODD.

Директива .ODD используется для установления нечётного значения счётчика адреса путем добавления единицы в случае его чётности.

Формат:

.ODD

Если текущее значение счётчика адреса нечётно, то директива .ODD не выполняет никакого действия.

7.5.3. Директивы .BLKB и .BLKW.

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

Формат:

.BLKB E
.BLKW E

где

E

- выражение, имеющее абсолютное значение и определяющее число байтов или слов, резервируемых в объектном модуле. По умолчанию E = 1.

Пример:

  1
  2
  3
  4 000000
  5
  6 000000    COUNT: .BLKW 1   ; РЕЗЕРВИРОВАТЬ 1 СЛОВО
  7
  8 000002   MESSAG: .BLKW 80. ; БУФЕР ДЛЯ ТЕКСТА СООБЩЕНИЯ
  9
 10 000122   CHRSAV: .BLKB     ; РЕЗЕРВИРОВАТЬ 1 БАЙТ
 11
 12 000123     FLAG: .BLKB
 13
 14 000124   MSGPTR: .BLKB
 

ПРИМЕЧАНИЕ. Действие директивы .BLKB аналогично действию оператора прямого присваивания:

. = выражение

По оператору прямого присваивания значение выражения прибавляется к текущему значению счётчика адреса. Однако, для увеличения значения счётчика адреса предпочтительно использовать директиву .BLKB.

7.5.4. Директива .LIMIT.

Директива .LIMIT используется для резервирования двух слов памяти, первое из которых предназначено для записи младшего адреса загрузочного модуля, второе - для записи адреса первого свободного слова, следующего за загрузочным модулем (старший адрес загрузочного модуля + 2).

Формат:

.LIMIT

Запись значений в зарезервированные слова выполняется во время связывания модулей по программе "Редактор связей".

Действие директивы .LIMIT аналогично действию директивы .BLKW 2.

7.6. Директива окончания: .END.

Директива .END используется для указания логического конца исходного модуля.

Формат:

.END [E]

где

E

- выражение, определяющее точку входа программы.

Предложения, расположенные за директивой .END в текущей исходной программе, игнорируются.

Если исходная программа состоит из нескольких модулей, каждый из которых транслируется отдельно, то только один модуль должен оканчиваться директивой .END с аргументом, а все остальные - директивой .END без аргумента.

Директива .END не должна использоваться в макроопределениях и блоках условной трансляции, но может использоваться в директиве непосредственной условной трансляции (п. 7.9.3).

7.7. Директивы секционирования.

Директивы секционирования дают возможность управлять распределением памяти для программы во время её связывания, так как все признаки, введённые с помощью директив секционирования, передаются редактору связей.

К директивам секционирования относятся:

.PSECT
.ASECT
.CSECT
.SAVE
.RESTORE

7.7.1. Директива .PSECT.

Директива .PSECT позволяет пользователю создавать программные секции и распределять команды и данные между программными секциями.

Формат:

.PSECT S,A1,...,AN

где

S

- символическое имя программной секции (табл. 10);

 

A1,...,AN

- один или несколько аргументов, разделённых запятыми, пробелами или символами ГТ (табл. 10).

Программная секция - это блок программы, который может быть отредактирован программой "Редактор связей" независимо от других блоков программы. Программная секция обычно начинается с директивы .PSECT, .CSECT или .ASECT.

Редактор связей использует признаки программной секции, задаваемые с помощью аргументов директивы .PSECT.

Таблица 10

Аргумент

Действие по умолчанию

Значение

S

Нет

Устанавливает имя программной секции, состоящее не более чем из шести символов, допустимых в коде RADIX-50. Имена программных секций могут совпадать с внутренними именами. Если имя отсутствует, то следующему аргументу должна предшествовать запятая

RO/RW

RW

Определяет признак доступа к данным программной секции: RO - разрешается только чтение; RW - разрешается чтение и запись

I/D

I

Определяет признак содержания программной секции: I - программная секция содержит команды; D - программная секция содержит данные

GBL/LCL

LCL

Определяет признак размещения программной секции: GBL - глобальная секция. Такая секция компонуется из модулей всей программы. Если глобальная секция размещена в модулях, входящих в разные сегменты, то редактор связей помещает её в сегмент с меньшим номером; LCL - локальная секция. Для каждого сегмента эта секция компонуется из модулей, входящих в данный сегмент. Аргументы GBL/LCL используются только для оверлейных программ. При построении односегментных не оверлейных программ аргументы GBL/LCL не имеют смысла, так как полное распределение памяти для этой программы осуществляется внутри корневого сегмента

SAV/NOSAV

NOSAV

Определяет область размещения программной секции: SAV - программная секция размещается в корневом сегменте; NOSAV - программная секция размещается обычным образом

ABS/REL

REL

Определяет признак перемещаемости программной секции: ABS - абсолютная секция. Размещение данных в абсолютной секции должно быть осуществлено внутри сегмента, содержащего программную секцию. Базовый адрес программной секции не изменяется, он равен нулю; REL - перемещаемая секция. Базовый адрес программной секции зависит от перемещения программной секции во время связывания

CON/OVR

CON

Определяет признак размещения программной секции: CON - все части программной секции редактор связей размещает в загрузочном модуле последовательно друг за другом. Размер отводимой области памяти равен сумме размеров всех частей данной секции; OVR - адрес загрузки для всех частей данной секции, находящихся в разных модулях, будет один и тот же. Размер отводимой области памяти равен размеру наибольшей части этой секции

В табл. 10 символ "/" в графе "Аргумент" означает, что должен быть использован один из данных аргументов. Если в директиве .PSECT указывается аргумент, отличный от перечисленных в табл. 10, то в листинге печатается сообщение об ошибке "A".

Признаки, определённые с помощью директивы .PSECT, действительны для всех последующих директив .PSECT, которые встречаются в данной программе с тем же именем.

Ассемблер разрешает создание 25610 программных секций:

Для каждой программной секции Ассемблер ведёт следующую информацию:

7.7.1.1. Создание программных секций

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

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

Пример:

     .PSECT        ; неименованная     программная  секция,
 A:  .WORD 0       ; транслируемая по относительным адресам
 B:  .WORD 0       ; 0, 2 и 4
     .PSECT ALPHA  ; именованная    программная     секция,
 X:  .WORD 0       ; транслируемая по относительным адресам
 Y:  .WORD 0       ; 0 и 2
     .PSECT        ; продолжение неименованной  программной
 D:  .WORD 0       ; секции, транслируемой по относительному
                   ; адресу 6

Программная секция описывается полностью первой директивой .PSECT. После этого на секцию может быть сделана ссылка с указанием только её имени.

Например, программная секция может быть описана директивой

.PSECT ALPHA,ABS,OVR

и в последующем на нее может быть сделана ссылка с помощью директивы

.PSECT ALPHA.

Если директива секционирования не задана, то Ассемблер предполагает заданной директиву .PSECT.

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

Пример:

     .PSECT SEC1,REL,RO ; начинается           перемещаемая
 A:  .WORD 0            ; программная секция, транслируемая
 B:  .WORD 0            ; по относительным адресам 0, 2 и 4
 C:  .WORD 0            ; коды транслируются по относитель-
 ST: CLR A              ; ным адресам с 6 по 12
     CLR B
     .PSECT SECA,ABS    ; начинается абсолютная программная
     .WORD .+2,A        ; секция   SECA. Коды транслируются
                        ; по абсолютным адресам 0 и 2
     .PSECT SEC1        ; возобновляется       перемещаемая
     INC A              ; программная секция     SEC1. Коды
     BR T               ; транслируются   по  относительным
                        ; адресам 14 и 16

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

Меткам, появляющимся в строке с директивой .ASECT, .CSECT, .PSECT, присваивается текущее значение счётчика адреса предыдущей секции.

Пример:

Если первая строка программы есть

A: .PSECT ALT,REL,

то метке A присваивается значение относительного нуля.

7.7.1.2. Распределение памяти

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

7.7.2. Директивы .ASECT и .CSECT.

Директива .ASECT используется для определения абсолютной программной секции, директива .CSECT - именованной или неименованной перемещаемой программной секции. Эти директивы сохранены для совместимости с предыдущими версиями Ассемблера.

Формат:

.ASECT
.CSECT [S]

где

S

- имя программной секции.

Ассемблер транслирует директивы .ASECT и .CSECT как директиву .PSECT с признаками, определяемыми по умолчанию (табл. 11).

Таблица 11

Директива

Значение признака директивы .PSECT

Имя

Доступ

Тип

Размещение

Перемещение

Распределение

.ASECT

.ABS

RW

I

GBL

ABS

OVR

.CSECT

-

RW

I

LCL

REL

CON

.CSECT S

S

RW

I

GBL

REL

OVR

7.7.3. Директива .SAVE.

Директива .SAVE используется для сохранения текущего контекста программной секции в верхней части стека. При этом текущий контекст программной секции остаётся в действии. Контекст программной секции включает текущее значение счётчика адреса и имя секции.

Формат:

.SAVE

Допускается использование до 16 директив .SAVE. Если стек полон, печатается сообщение об ошибке "A".

7.7.4. Директива .RESTORE.

Директива .RESTORE используется для восстановления из стека контекста программной секции.

Формат:

.RESTORE

По директиве .RESTORE текущее значение счётчика адреса и имя секции устанавливаются в значения, которые они имели к моменту выполнения директивы .SAVE.

Если при выполнении директивы .RESTORE стек пуст, печатается сообщение об ошибке "A".

Пример:

В данном примере показано использование директив .SAVE и .RESTORE.

     1                                 .MACRO DS NAME,SIZE
     2                                 .SAVE
     3                                 .PSECT IMPURE,D,GBL
     4                           NAME: .BLKW SIZE
     5                                 .RESTORE
     6                                 .ENDM
     7
     8  000000 016701 000000'  SCANSY: MOV SYMBAS,R1
     9  000004 010167 000002'          MOV R1,CURSYM
     10 000010 066701 000004'          ADD SYMSIZ,R1
     11 000014 010167 000006'          MOV R1,SYMTOP
     12
     13 000020 000207                  RETURN
     14
     15 000022                         DS SYMBAS
     16 000022                         DS CURSYM
     17 000022                         DS SYMSIZ
     18 000022                         DS SYMSIZ
     19 000022 016701 000006'   SSORT: MOV SYMTOP,R1
     20        000001                  .END

7.8. Директивы описания имён.

Директивы описания имён используются для описания имён как глобальных и внешних. К директивам описания имён относятся:

.GLOBL
.WEAK.

7.8.1. Директива .GLOBL.

Директива .GLOBL используется для описания имён как глобальных. Глобальные имена используются для организации связи между модулями. Формат:

.GLOBL S1,S2,...,SN

где

S1,S2,...,SN

- символические имена, разделённые запятыми, пробелами или символами ГТ.

Директива .GLOBL A,B эквивалентна по своему действию следующим предложениям:

А==:выражение
В==:выражение

или

A==выражение
В==выражение

или

А::
В::

В конце первого прохода Ассемблер проверяет, определено ли данное глобальное имя внутри текущего программного модуля. Если имя не определено в текущем модуле, то оно рассматривается как внешнее имя. Все внешние имена, появляющиеся внутри данной программы, должны быть определены в конце первого прохода, в противном случае они рассматриваются как глобальные ссылки по умолчанию. Описание разрешения/запрещения глобальных ссылок приведено в п. 7.2.1.

Пример подпрограммы с двумя точками входа. Подпрограмма вызывает другую подпрограмму.

           .PSECT
           .GLOBL A,C
     A:    MOV @(R5)+,R0
           MOV #X,R1
     X:    JSR PC,C
           RTS R5
     B::   MOV (R5)+,R1
           CLR R2
           BR X

7.8.2. Директива .WEAK.

Директива .WEAK используется для описания имён как внешних. Поиск указанных имён в объектной библиотеке запрещается.

Формат:

.WEAK S1,...,SN

где

S1,...,SN

- символические имена, разделённые запятыми, пробелами или символами ГТ.

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

Пример:

.WEAK SUB1,SUB2

7.9. Директивы условной трансляции.

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

К директивам условной трансляции относятся:

.IF
.ENDC
.IFF
.IFT
.IFTF
.IIF.

7.9.1. Директивы .IF и .ENDC.

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

Формат блока условной трансляции:

     .IF УСЛОВИЕ, A1[,A2,...,AN]
        .
        .
        .
       БЛОК
        .
        .
        .
      .ENDC

 

где

.IF

- директива начала блока условной трансляции;

 

УСЛОВИЕ

- условие согласно табл. 12;

 

,

- разделительный символ: запятая, пробел или символ ГТ;

 

A1,[A2,...,AN]

-символические аргументы и/или выражения для проверки указанных условий;

 

БЛОК

- блок исходной программы;

 

.ENDC

- директива окончания блока условной трансляции.

Блок программы транслируется, если условие выполняется, и не транслируется в противном случае.

Условия, отличные от перечисленных в табл. 12, недопустимый аргумент или отсутствие аргументов в директиве .IF вызывает печать в листинге сообщения об ошибке "A".

Таблица 12

Условие

Аргумент

Блок транслируется, если

EQ/NE

Выражение

выражение равно нулю / не равно нулю

GT/LE

-"-

выражение больше нуля / меньше или равно нулю

LT/GE

-"-

выражение меньше нуля / больше или равно нулю

DF/NDF

Символическое имя

имя определено / не определено

B/NB

Макропараметр

параметр есть / параметра нет

IDN/DIF

Два макропараметра

параметры одинаковы / различны

ПРИМЕЧАНИЕ. В табл. 12 символ "/" в графе "Условие" означает, что должно быть использовано одно из данных условий.

Параметр макрокоманды, который используется как аргумент директивы условной трансляции, должен заключаться в символы "<" и ">" или отмечаться символом "^".

Например,

<A,B,C>
^/124/

При проверке условий DF и NDF символические аргументы могут группироваться с помощью логических операций "&" и "!" (см. табл. 4).

Пример:

     .IF DF SYM1&SYM2
         .
         .
         .
     .ENDC

В данном примере блок транслируется, если определены два аргумента SYM1 и SYM2.

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

Формат вложенных директив условной трансляции:

     .IF УСЛОВИЕ, A1
     .IF УСЛОВИЕ, A1
         .
         .
         .
     .ENDC
     .ENDC

Использование директивы .ENDC вне блока условной трансляции или попытка превзойти допустимую глубину уровней вложения вызывает печать в листинге сообщения об ошибке "O".

Пример:

     .IF DF SYM1
     .IF DF SYM2
         .
         .
         .
     .ENDC
     .ENDC

7.9.2. Директивы .IFF, .IFT, .IFTF.

Директивы .IFF, .IFT, .IFTF используются только внутри блока условной трансляции. Назначение директив приведено в табл. 13. Часть программы, следующая за одной из данных директив до следующей директивы условной трансляции или до конца блока условной трансляции, транслируется или нет в зависимости от результата проверки условия в директиве .IF.

Таблица 13
Назначение директив

Директива

Назначение

.IFF

Блок транслируется, если условие не выполнено

.IFT

Блок транслируется, если условие выполнено

.IFTF

Блок транслируется независимо от значения условия

Использование директив условной трансляции .IFF, .IFT, .IFTF вне блока условной трансляции вызывает печать в листинге сообщения об ошибке "O".

Если для вложенных директив условной трансляции не выполняется внешнее условие, то внутренние директивы условной трансляции игнорируются.

Пример 1:

Предполагается, что имя SYM определено.

     .IF DF SYM  ; условие выполнено,    транслировать блок
         .
         .
         .
     .IFF        ; условие выполнено, не транслировать блок
         .
         .
         .
     .IFT        ; условие  выполнено,   транслировать блок
         .
         .
         .
     .IFTF       ; транслировать   блок   независимо     от
         .       ; выполнения условия
         .
         .
     .IFT        ; условие выполнено,    транслировать блок
         .
         .
         .
     .ENDC

Пример 2:

Предполагается, что имя X определено, а Y - не определено.

     .IF DF X    ; условие выполнено
     .IF DF Y    ; условие не выполнено
     .IFF        ; условие не выполнено, транслировать блок
         .
         .
         .
     .IFT        ; условие    не выполнено, не транслировать
         .       ; блок
         .
         .
     .ENDC
     .ENDC

Пример 3:

Предполагается, что имя А определено, а имя В - не определено.

     .IF DF A    ; условие   выполнено, транслировать блок
     MOV  A,R1
         .
         .
         .
     .IFF        ; условие выполнено, не транслировать блок
     MOV R1,R0
         .
         .
         .
     .IF NDF B   ; директива      условной      трансляции
         .       ; игнорируется
         .
         .
     .ENDC
     .ENDC

Пример 4:

Предполагается, что X - определено, а Y - не определено.

     .IF DF X    ; условие не выполнено, не транслировать
         .       ; блок
         .
         .
     .IF DF Y    ; директива    условной        трансляции
         .       ; игнорируется
         .
         .
     .IFT        ; директива игнорируется
         .
         .
         .
     .IFT        ; директива игнорируется
         .
         .
         .
     .ENDC
     .ENDC

7.9.3. Директива .IIF.

Директива .IIF является директивой непосредственной условной трансляции. Блок условной трансляции содержит одно предложение и находится на одной строке с директивой. При использовании данной директивы не требуется директива окончания блока условной трансляции .ENDC.

Формат:

.IIF условие,А1,предложение

где

условие

- условие согласно табл. 12;

 

,

- разделительный символ: запятая, пробел или символ ГТ. Если в качестве аргумента используется выражение, то разделительным символом должна быть запятая;

 

A1

- аргумент директивы непосредственной условной трансляции (см. табл. 12);

 

предложение

- предложение исходной программы, которое транслируется, если условие выполнено.

Пример:

.IIF DF FOO,BEQ ALPHA

Предложение BEQ ALPHA транслируется, если имя FOO определено в исходной программе.

7.10. Директивы управления файлами.

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

7.10.1. Директива .LIBRARY.

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

Формат:

.LIBRARY /C/

где

С

- спецификация файла макробиблиотеки;

 

/ /

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

Макробиблиотеки, включённые в список, просматриваются Ассемблером в случае задания в исходной программе директив .MCALL или .ENABL MCL или появления неопределённого символического имени.

Макробиблиотеки, включённые в список просматриваемых библиотек, просматриваются в порядке, обратном их заданию. Если спецификация файла макробиблиотеки задана не полностью, по умолчанию принимаются следующие значения: имя устройства - DK: тип файла - .MLB.

ПРИМЕЧАНИЯ:

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

2. Максимальное число файлов макробиблиотеки определяется числом 12 минус N, где N - число одновременно транслируемых файлов.

3. Директива .LIBRARY записывается в исходной программе до появления первой описанной в ней макрокоманды.

Примеры:

.LIBRARY /DK:USLIB.MLB/
.LIBRARY ?DK:SYSDEF.MLB?
.LIBRARY \CURRENT.MLB\

7.10.2. Директива .INCLUDE.

Директива .INCLUDE используется для ввода исходного файла в транслируемый исходный файл.

Формат:

.INCLUDE /C/

где

С

- спецификация вводимого исходного файла;

 

/ /

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

При появлении директивы .INCLUDE текущий файл записывается в стек и транслируется вводимый файл. При достижении конца вводимого файла текущий файл удаляется из стека, и трансляция продолжается со строки, следующей за директивой.

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

Максимальный уровень вложения исходных файлов для директив .INCLUDE равен 5.

Если спецификация вводимого файла задана не полностью, по умолчанию принимаются следующие значения:

имя устройства - DK:

тип файла - .MAC.

ПРИМЕЧАНИЕ. При использовании директивы .INCLUDE драйвер устройства, на котором находится вводимый файл, должен быть резидентным.

Примеры:

.INCLUDE /DR3: [ 1,2]MACROS/
.INCLUDE ?DK:SYSDEF?
.INCLUDE \CURRENT.MAC\

8. МАКРОСРЕДСТВА ЯЗЫКА АССЕМБЛЕРА

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

К макросредствам языка Ассемблер относятся макроопределения, макрокоманды и директивы определения характеристик макропараметров.

8.1. Макроопределение.

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

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

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

Одно и то же макроопределение может быть использовано в нескольких программах. Для этого следует поместить макроопределение в макробиблиотеку пользователя или системную макробиблиотеку. Макроопределение хранится в макробиблиотеке с именем, которое указано в директиве .MACRO.

Параметры в макроопределении называются формальными параметрами, а в макрокомандах - фактическими.

8.1.1. Директива .MACRO.

Директива .MACRO, используется для указания начала макроопределения.

Формат:

.MACRO S,A1,A2,...,AN

где

S

- символическое имя, называемое именем макроопределения;

 

,

- допустимый разделительный символ: запятая, пробел или символ ГТ;

 

А1,А2,... ,AN

- список формальных параметров, представляющих собой допустимые символические имена.

Параметры отделяются друг от друга разделительными символами: запятой, пробелом или символом ГТ. За параметрами может следовать комментарий.

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

ПРИМЕЧАНИЕ. В директиве .MACRO разрешается использование метки, но вводить её не рекомендуется, особенно для вложенных макроопределений, так как неправильные метки и метки, создаваемые с символом конкатенации, приводят к игнорированию данной директивы. Данное ПРИМЕЧАНИЕ относится также к директивам .IRP, .IRPC, .REPT.

8.1.2. Директива .ENDM.

Директива .ENDM используется для указания конца макроопределения.

Формат:

.ENDM [S]

где

S

- имя макроопределения.

Указание имени в директиве .ENDM даёт возможность транслятору обнаружить пропущенные директивы .ENDM и макроопределения с неправильными вложениями.

Имя S в директиве .ENDM должно совпадать с именем, указанным в соответствующей директиве .MACRO.

За директивой .ENDM может следовать комментарий. Директива .ENDM, используемая вне макроопределения, вызывает печать сообщения об ошибке "O".

Если имя макроопределения и имя, указанное в директиве .ENDM, не совпадают, то в листинге печатается сообщение об ошибке "A".

ПРИМЕЧАНИЯ:

  1. В директиве .ENDM метка игнорируется.
  2. Директива .ENDM с недопустимой меткой игнорируется.

Пример:

     .MACRO TYPMSG MESSAGE   ; НАПЕЧАТАТЬ СООБЩЕНИЕ
     JSR R5,TYPMSG
     .WORD MESSAGE
     .ENDM

8.1.3. Директива .MEXIT.

Директива .MEXIT используется в макроопределении для завершения макрорасширения до того, как встретится директива окончания макроопределения .ENDM.

Формат:

.MEXIT

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

Пример:

     .MACRO ALTR N,A,B   ; НАЧАЛО МАКРООПРЕДЕЛЕНИЯ
         .
         .
         .
     .IF EQ N
         .
         .
         .
     .MEXIT
     .ENDC
         .
         .
 

Если в макрокоманде ALTR фактический параметр, соответствующий формальному параметру N макроопределения, равен нулю, то блок условной трансляции транслируется и директива .MEXIT будет завершать и блок условной трансляции и макрорасширение. Для вложенных макрокоманд директива .MEXIT осуществляет переход к макрокоманде внешнего уровня.

Директива .MEXIT, используемая вне макроопределения, вызывает печать в листинге сообщения об ошибке "O".

8.1.4. Форматирование макроопределений

Символ ПФ (перевод формата), используемый в макроопределении, вызывает переход на новую страницу листинга во время трансляции макроопределения. Однако, переход на новую страницу не осуществляется при расширении макрокоманды.

Если в макроопределении указывается директива .PAGE то она игнорируется во время трансляции макроопределения, но при расширении данной макрокоманды осуществляется переход на новую страницу.

8.2. Макрокоманда.

Макрокоманда - предложение на языке Ассемблера, которое во время трансляции заменяется макрорасширением.

Макрорасширение - макроопределение, в котором формальные параметры заменены на соответствующие им фактические параметры.

Формат макрокоманды:

S фактические параметры

где

S

- имя макрокоманды;

 

фактические
параметры

- символические имена, которые соответствуют формальным параметрам, указанным в директиве .MACRO, разделённые запятой, пробелом или символом ГТ.

Имя макрокоманды должно совпадать с именем макроопределения.

Если имя макрокоманды совпадает с именем метки, то в поле операции это имя означает макрокоманду, а в поле операнда - метку.

ПРИМЕЧАНИЕ. Макроопределение должно быть введено директивой .MACRO до того, как будет выполнена макрокоманда и осуществлено макрорасширение.

Пример:

ABS: MOV (R0),R1       ; ABS - МЕТКА
       .
       .
       .
     BR ABS            ; ПЕРЕХОД К МЕТКЕ ABS
       .
       .
       .
     ABS #4,ENT,LAR    ; ABS - МАКРОКОМАНДА
 

8.3. Параметры в макроопределениях и макрокомандах.

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

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

Ключевые параметры - параметры, содержащие ключевые слова.

Формат ключевого параметра:

имя = последовательность символов

где

имя

- формальный параметр (ключевое слово);

 

последовательность символов

- значение ключевого слова, соответствующее фактическому параметру.

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

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

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

Параметры, содержащие разделительные символы, должны быть ограничены символами "<" и ">" (пример 1).

Параметры, содержащие специальные символы, ограничивать символами "<" и ">" не обязательно (пример 2).

Символ "^" позволяет использовать символы "<" и ">" как часть параметра (пример 3).

Параметры могут включать специальные символы без ограничения их символами "<" и ">", если только данный параметр не содержит разделительных символов (запятой, точки с запятой, пробела или символа ГТ).

Примеры:

1)   .MACRO REN A,B,C
         .
         .
         .
     .ENDM
         .
         .
         .
     REN <MOV X,Y>,#44,WEN

Фактический параметр MOV X,Y соответствует формальному параметру А.

2)   .MACRO PUSH ARG
     MOV ARG,-(SP)
     .ENDM
     PUSH X+3(%2)

Макрорасширение команды PUSH будет следующим:

MOV X+3(%2),-(SP)

3) В макрокоманде

REN ^/<MOV X,Y>/,#44,WEN

последовательность символов <MOV X,Y> является одним из параметров макрокоманды.

При записи параметров, ограниченных символами "<" и ">", могут использоваться пробелы для наглядности.

Если в макрокоманде задано больше параметров, чем в макроопределении, то в листинге программы печатается сообщение об ошибке "Q". Если в макрокоманде задано меньше параметров, чем в макроопределении, то отсутствующим параметрам присваиваются пустые значения. Директивы условной трансляции .IF В и .IF NB могут быть использованы для обнаружения отсутствующих параметров. Число параметров может быть определено также по директиве .NARG.

ПРИМЕЧАНИЕ. Макрокоманда может быть задана без каких-либо параметров.

Пример:

В данном примере показано использование ключевых параметров.

  1                 .GLOBL A,B,C,TEMP,VAR,ALB,BAK
  2                 .MACRO TECT CON=1,BLOCK,ADDR=TEMP
  3                 .WORD CON
  4                 .WORD BLOCK
  5                 .WORD ADDR
  6                 .ENDM
  7
  8 000000          TECT A,B,C
    000000 000000G  .WORD A
    000002 000000G  .WORD B
    000004 000000G  .WORD C
  9
 10 000006          TECT ADDR=20,BLOCK=30,CON=40
    000006 000040   .WORD 40
    000010 000030   .WORD 30
    000012 000020   .WORD 20
 11
 12
 13 000014          TECT BLOCK=5
    000014 000001   .WORD 1
    000016 000005   .WORD 5
    000020 000000G  .WORD TEMP
 14
 15 000022          TECT CON=5,ADDR=VAR
    000022 000005   .WORD 5
    000024 000000   .WORD 0
    000026 000000G  .WORD VAR
 16
 17 000030          TECT
    000030 000001   .WORD 1
    000032 000000   .WORD
    000034 000000G  .WORD TEMP
 18
 19 000036          TECT ADDR=ALB!BAK
    000036 000001   .WORD 1
    000040 000000   .WORD
    000042 000000G  .WORD ALB!BAK
 20
 21        000001   .END

8.3.1. Конкатенация параметров

Символ "'" (апостроф), который стоит перед формальным параметром в макроопределении или следует за ним, означает, что в макрорасширении фактический параметр, соответствующий данному формальному параметру, будет соединяться с символами, стоящими рядом с формальным параметром.

Пример:

     .MACRO DEF A,B,C
A'B: .ASCIZ /C/
     .BYTE ''A,''B
     .ENDM
        .
        .
        .
     DEF X,Y,<MACRO B03.00>
        .
        .
        .

Макрокоманда DEF X,Y,<MACRO B03.00> вызывает макрорасширение:

XY:  .ASCIZ /MACRO B03.00/
     .BYTE 'X,'Y

В макрорасширении метке A'B соответствует метка XY, так как апостроф опускается и формальные параметры заменяются на фактические. В операндах директивы .BYTE первый символ апостроф остаётся в макрорасширении, так как перед ним и после него не следует формальный параметр в макроопределении. Второй апостроф опускается и подставляется фактический параметр. В результате директива .BYTE записывается в виде .BYTE 'X, 'Y.

8.3.2. Арифметический параметр

Символ "\", который стоит перед параметром в макрокоманде, определяет его как арифметический параметр, т.е. в макрорасширении этот параметр заменяется числовым значением, в текущей системе счисления, которая устанавливается директивой .RADIX.

 1                              .MACRO INC A,B
 2                              CON A,\B
 3                              B=B+1
 4                              .ENDM
 5
 6                              .MACRO CON A,B
 7                         A'B: .WORD 4
 8                              .ENDM
 9
10
11 000000    160    162    157  .ASCIZ /ПРОГРАММА/
   000003    147    162    141
   000006    155    155    141
   000011    000
12                              .EVEN
13
14        000000                C=0
15 000012                       INC X,C
   000012                       CON X,\C
   000012 000004            X0: .WORD 4
          000001                C=C+1
16
17 000014 000010                .WORD 10
19 000016                       INC X,C
   000016                       CON X,\C
   000016 000004            X1: .WORD 4
          000002                C=C+1
20
21 000020    007                .BYTE 7
22                              .EVEN
23
24 000022                       INC X,C
   000022
   000022 000004            X2: .WORD 4
          000003                C=C+1
25
26        000001                .END

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

Пример:

     ID=6
     .MACRO IDT SYM
     .IDENT /V05A'SYM/
     .ENDM
       .
       .
       .
     IDT \ID

Макрорасширение IDT \ID будет:

.IDENT /V05A6/

8.3.3. Локальные метки в макрорасширениях.

В качестве меток в макрорасширениях используются локальные метки, создаваемые Ассемблером автоматически. Такие метки записываются в возрастающем порядке в виде (30000. <= N <= 65535.).

Для задания автоматического создания локальных меток необходимо в макроопределении перед формальным параметром указать символ "?". При вызове макрокоманды соответствующий фактический параметр должен отсутствовать или быть равным 0. Если же в макрокоманде фактический параметр определён, автоматического создания локальных меток не осуществляется и выполняется обычная замена формального параметра на фактический.

Использование локальных меток, создаваемых автоматически, позволяет избежать многократного определения метки.

Автоматическое создание локальных меток возможно только для первых 16. параметров макроопределения.

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

Пример:

        .MACRO ALRHA A,?B
        TST A
        BEQ B
        ADD #5,A
     B: .WORD 100
        .ENDM

        ALPHA R1           ; ЛОКАЛЬНАЯ МЕТКА СОЗДАЁТСЯ

        TST R1
        BEQ 30000¤
        ADD #5,R1
30000¤: .WORD 100

        ALPHA R2,XYZ       ; ЛОКАЛЬНАЯ МЕТКА НЕ СОЗДАЁТСЯ

        TST R2
        BEQ XYZ
        ADD #5,R2
   XYZ: .WORD 100

8.3.4. Уровни макрокоманд

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

Внешние макрокоманды, используемые в исходной программе, называются макрокомандами первого уровня. Если макроопределение, соответствующее макрокоманде первого уровня, содержит внутренние макрокоманды, то последние называются макрокомандами второго уровня и т.д. Число уровней макрокоманд зависит от объёма памяти, занимаемого исходной программой, которая будет транслироваться.

Формальный параметр внутренней макрокоманды должен быть ограничен символами "<" и ">", если соответствующий ему фактический параметр содержит разделительные символы. Символы "<" и ">" для каждого уровня макрокоманд используются в макроопределении, но не в макрокоманде.

Пример:

     .MACRO LEVEL1 DUM1,DUM2
     LEVEL2 <DUM1>
     LEVEL2 <DUM2>
     .ENDM
     .MACRO LEVEL2 DUM3
     DUM3
     ADD #10,R0
     MOV R0,(R1)+
     .ENDM

Для макрокоманды: LEVEL1 <MOV X,R0>,<MOV R2,R0> макрорасширение имеет вид:

     MOV X,R0
     ADD #10,R0
     MOV R0,(R1)+
     MOV R2,R0
     ADD #10,R0
     MOV R0,R1

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

Пример:

     .MACRO LV1 A,B
         .
         .
         .
     .MACRO LV2 C
         .
         .
         .
     .ENDM
     .ENDM

Макроопределение LV2 не может быть вызвано и расширено до тех пор, пока не будет вызвано макроопределение LV1.

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

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

К данной группе директив относятся:

.NARG,
.NCNR,
.NTYPE.

8.4.1. Директива .NARG.

Директива .NARG используется для определения числа параметров в макрокоманде.

Формат:

.NARG S

где

S

- допустимое символическое имя.

После выполнения директивы имя S получает значение, равное числу параметров в макрокоманде, для которой выполняется макрорасширение.

Директива .NARG записывается только в макроопределении. Если директива .NARG используется вне макроопределения, то в листинге печатается сообщение об ошибке "A".

Пример:

     1                      .MACRO NOPP NUM
     2                      .NARG SYM
     3                      .IF EQ,SYM
     4                      .MEXIT
     5                      .IFF
     6                      .REPT NUM
     7                      NOP
     8                      .ENDM
     9                      .ENDC
    10                      .ENDM
    11  000000              NOPP
                            .NARG SYM
                            .IF EQ,SYM
                            .MEXIT
                            .IFF
                            .REPT
                            NOP
                            .ENDM
                            .ENDC
    12 000000               NOPP 6
              000001        .NARG SYM
                            .IF EQ,SYM
                            .MEXIT
                            .IFF
              000006        .REPT 6
                            NOP
                            .ENDM
       000000 000240        NOP
       000002 000240        NOP
       000004 000240        NOP
       000006 000240        NOP
       000010 000240        NOP
       000012 000240        NOP
    13                      .ENDC
    14        000001        .END

8.4.2. Директива .NCHR.

Директива .NCHR используется для определения числа символов в указанной последовательности символов.

Формат:

.NCHR S,<C>

где

S

- допустимое символическое имя;

 

,

- разделительный символ: запятая, пробел или символ ГТ;

 

<C>

- последовательность печатных символов. Данная последовательность символов должна быть ограничена символами "<" и ">" или символами "^", если она содержит разделительные символы: запятую, пробел или символ ГТ.

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

Директива .NCHR может быть использована для определения длины макропараметров.

Если символическое имя S не указано, то в листинге печатается сообщение об ошибке "A". Данное сообщение печатается также в случае, если заданы непарные ограничители последовательности символов или если конечный ограничитель не может быть найден из-за синтаксической ошибки в последовательности символов (происходит преждевременное прекращение обработки последовательности символов).

Пример:

 1                                   .MACRO CHAR MESS
 2                                   .NCHR SYM, MESS
 3                                   .WORD SYM
 4                                   .ASCIZ /MESS/
 5                                   .EVEN
 6                                   .ENDM
 7
 8 000000                      MSG:  CHAR <ОШИБКА>
          000006                     .NCHR SYM,ОШИБКА
   000000 000006                     .WORD SYM
   000002    157    173    151       .ASCIZ /ОШИБКА/
   000005    142    153    141
   000010    000
                                     .EVEN
 9        000001                     .END

8.4.3. Директива .NTYPE.

Директива .NTYPE используется для определения метода адресации указанного параметра макрокоманды.

Формат:

.NTYPE S,E

где

S

- допустимое символическое имя;

 

,

- разделительный символ: запятая, пробел или символ ГТ;

 

E

- допустимый параметр, метод адресации которого необходимо определить.

В макрорасширении имени S присваивается значение, равное значению 6-разрядного метода адресации указанного параметра.

Если параметр E не указан, то результат будет равен нулю.

Директива .NTYPE записывается только в макроопределении. Если она появится в другом месте, то в листинге печатается сообщение об ошибке "A".

Пример:

 1                             .MACRO SAVE,ARG
 2                             .NTYPE SYM,ARG
 3                             .IF EQ,SYM&70
 4                             MOV ARG,-(SP)
 5                             .IFF
 6                             MOV #ARG,-(SP)
 7                             .ENDC
 8                             .ENDM
 9
 10 000000 000000      TEMP:   .WORD 0
 11
 12 000002                     SAVE R1
           000001              .NTYPE SYM,R1
                               .IF EQ,SYM&70
                               MOV R1,-(SP)
    000002 010146              .IFF
                               MOV #R1,-(SP)
                               .ENDC
 13
 14
 15 000004                     SAVE TEMP
           000067              .NTYPE SYM,TEMP
                               .IF EQ,SYM&70
                               MOV TEMP,-(SP)
                               .IFF
    000004 012746 000000'      MOV #TEMP,-(SP)
 16                            .ENDM
 17        000001              .END

8.5. Директивы .ERROR и .PRINT.

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

Формат:

.ERROR [Е] ;текст
.PRINT [Е] ;текст

где

E

- допустимое выражение, значение которого выводится на терминал при появлении директивы;

 

текст

- текст указанного сообщения, которое будет печататься на терминале.

Сообщения, выводимые по директиве, содержат:

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

Директива .PRINT аналогична директиве .ERROR, за исключением того, что она не выдаёт сообщение об ошибке "P". Пример:

Директива .ERROR А ; INVALID ARGUMENT вызывает печать следующего сообщения:

     P   512 005642 000076 .ERROR A ; INVALID ARGUMENT

8.6. Директивы задания области неопределённых повторений .IRP и .IRPC.

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

8.6.1. Директива .IRP.

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

Формат области неопределённых повторений:

     .IRP S,<A1,A2,...,AN>
        .
        .
        .
     ОБЛАСТЬ
     НЕОПРЕДЕЛЁННЫХ
     ПОВТОРЕНИЙ
         .
         .
         .
     .ENDM

где

S

- формальный параметр, представляющий собой допустимое символическое имя;

 

,

- разделительный символ: запятая, пробел или символ ГТ;

 

<A1, A2,..., AN>

- список фактических параметров, ограниченный символами "<" и ">". Фактическим параметром может быть одиночный символ или последовательность символов. Если список содержит несколько параметров, то они отделяются разделительными символами: запятой, пробелом или символом ГТ;

 

Область неопределённых повторений

- блок программы, который может быть повторен один раз для каждого параметра из списка фактических параметров;

 

.ENDM

-директива окончания области неопределённых повторений.

Область неопределённых повторений может включать другие макроопределения и области повторений. Директива .MEXIT допустима в пределах области неопределённых повторений.

Пример использования директивы .IRP приведён в п. 8.6.2.

8.6.2. Директива .IRPC.

Директива .IRPC определяет начало области неопределённых повторений и используется для замены отдельных символов.

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

Формат:

     .IRPC S,<C>
         .
         .
         .
     ОБЛАСТЬ
     НЕОПРЕДЕЛЁННЫХ
     ПОВТОРЕНИЙ
         .
         .
         .
     .ENDM

где

S

- формальный параметр, представляющий собой допустимое символическое имя;

 

,

- разделительный символ: запятая, пробел или символ ГТ;

 

<C>

- последовательность символов, ограниченная символами "<" и ">";

 

область неопределённых повторений

- блок программы, который должен быть повторен один раз для каждого символа из последовательности;

 

.ENDM

- директива окончания области неопределённых повторений.

Область неопределённых повторений может содержать макроопределения и области повторения. Директива .MEXIT допустима в пределах области неопределённых повторений.

Если формальный параметр S не задан, в листинге печатается сообщение об ошибке "A".

ПРИМЕЧАНИЕ. Символы "<" и ">" используются для наглядности, а также в тех случаях, когда параметр "С" содержит разделительные символы.

Пример:

В данном примере показано использование директив .IRP и .IRPC.

 1                       .TITLE IRPTST
 2                       .LIST ME
 3 000000          REGS: .IRP REG,<PC,SP,R5,R4,R3,R2,R1,R0>
 4                       .RAD50 /REG/
 5                       .ENDR
   000000 062170         .RAD50 /PC/
   000002 074500         .RAD50 /SP/
   000004 072770         .RAD50 /R5/
   000006 072720         .RAD50 /R4/
   000010 072650         .RAD50 /R3/
   000012 072600         .RAD50 /R2/
   000014 072530         .RAD50 /R1/
   000016 072460         .RAD50 /R0/
 6 000020         REGS2: .IRPC NUM,<76543210>
 7                       .RAD50 /R'NUM/
 8                       .ENDR
   000020 073110         .RAD50 /R7/
   000022 073040         .RAD50 /R6/
   000024 072770         .RAD50 /R5/
   000026 072720         .RAD50 /R4/
   000030 072650         .RAD50 /R3/
   000032 072600         .RAD50 /R2/
   000034 072530         .RAD50 /R1/
   000036 072460         .RAD50 /R0/
 9        000001         .END

8.7. Директивы .REPT и .ENDR.

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

Формат области повторений:

     .REPT E
        .
        .
        .
     ОБЛАСТЬ
     ПОВТОРЕНИЙ
        .
        .
        .
     .ENDR

где

E

- абсолютное выражение, значение которого определяет число повторений области повторений;

 

Область повторений

- блок программы, который должен быть повторен заданное число раз;

 

.ENDR

- директива окончания области повторений.

Конец области повторений может быть указан директивой .ENDM.

Область повторений может включать макроопределения, области неопределённых повторений или другие области повторений. Директива .MEXIT допустима в пределах области повторений.

Если выражение E меньше или равно нулю, то область повторений не транслируется. Если E не является абсолютным выражением, то в листинге печатается сообщение об ошибке "A".

8.8. Директива .MCALL.

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

Формат:

.MCALL A1,A2,...,AN,

где

A1, A2,..., AN

- имена макроопределений из макробиблиотек.

Имена макроопределений разделяются запятыми, пробелами или символами <ГТ>.

Если после просмотра макробиблиотек макроопределение с указанным именем не будет обнаружено, то в строке листинга, содержащей директиву .MCALL, печатается сообщение об ошибке "U", а в строке, содержащей макрокоманду с неопределённым именем, печатается сообщение об ошибке "O".

8.9. Директива .MDELETE.

Директива .MDELETE стирает указанные макроопределения и освобождает виртуальную память.

Формат:

.MDELETE S1,S2,...,SN

где

S1, S2,..., SN

- допустимые имена макроопределений.

Если указано несколько имён, то они разделяются любым допустимым разделителем: запятой, пробелом или символом <ГТ>.

При обращении к стёртым макроопределениям печатается сообщение об ошибке "O".

Пример:

.MDELETE .EXIT,EXIT¤S

ПРИЛОЖЕНИЕ 1
СПЕЦИАЛЬНЫЕ СИМВОЛЫ ЯЗЫКА АССЕМБЛЕР

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

Таблица
СПЕЦИАЛЬНЫЕ СИМВОЛЫ

Символ

Назначение символа

:

Ограничитель метки

=

Оператор прямого присваивания

%

Указатель регистра

ГТ

Ограничитель аргументов или ограничитель поля

Пробел

Ограничитель аргументов или ограничитель поля

#

Указатель непосредственной адресации

@

Указатель косвенной адресации

(

Начальный указатель регистра

)

Конечный указатель регистра

,

Разделитель поля операндов

;

Указатель поля комментария

+

Знак арифметической операции сложения или указатель автоинкрементного метода адресации

-

Знак арифметической операции вычитания или указатель автодекрементного метода адресации

*

Знак арифметической операции умножения

/

Знак арифметической операции деления

&

Знак логической операции "И"

!

Знак логической операции "ИЛИ"

"

Указатель двух символов КОИ-7

'

Указатель одиночного символа КОИ-7 или признак конкатенации

.

Указатель счётчика адреса

Указатель начала параметра

Указатель конца параметра

^

Указатель специальной операции или указатель параметра

\

Указатель арифметического параметра макрокоманды

ВК

Ограничитель строки программы

ПРИЛОЖЕНИЕ 2
ПРЕДСТАВЛЕНИЕ СИМВОЛОВ В КОДЕ КОИ-7 И RADIX-50

В данном приложении приведено представление символов в 7-разрядном коде для обмена информацией КОИ-7H0 (ASCII) (табл. 1), КОИ-7H1 (табл. 2), RADIX-50 (табл. 3) и позиционное значение кода RADIX-50 (табл. 4).

7-БИТНЫЙ КОД ASCII
Таблица 1

000

NUL

020

DLE

040

SP

060

0

100

@

120

P

140

`

160

p

001

SOH

021

DC1

041

!

061

1

101

А

121

Q

141

а

161

q

002

STX

022

DC2

042

"

061

2

102

В

122

R

142

b

162

r

003

ETX

023

DC3

043

#

063

3

103

С

123

S

143

с

163

s

004

EOT

024

DC4

044

¤

064

4

104

D

124

T

144

d

164

t

005

ENQ

025

NEK

045

%

065

5

105

E

125

U

145

e

165

u

006

ACK

026

SYN

046

&

066

6

106

F

126

V

146

f

166

v

007

BEL

027

ETB

047

'

067

7

107

G

127

W

147

g

167

w

010

BS

030

CAN

050

(

070

8

110

H

130

X

150

h

170

x

011

HT

031

ЕМ

051

)

071

9

111

I

131

Y

151

i

171

У

012

LF

032

SUB

052

*

072

:

112

J

132

Z

152

j

172

z

013

VT

033

ESC

053

+

073

;

113

К

133

[

153

k

173

{

014

FF

034

FS

054

,

074

<

114

L

134

\

154

l

174

|

015

CR

035

GS

055

-

075

=

115

M

135

]

155

m

175

}

016

SO

036

RS

056

.

076

>

116

N

136

^

156

n

176

~

017

SI

037

US

057

/

077

?

117

О

137

_

157

о

177

DEL

 

КОИ-7H1
Таблица 2

000

NUL

020

DLE

040

SP

060

0

100

ю

120

п

140

Ю

160

П

001

SOH

021

DC1

041

!

061

1

101

а

121

я

141

А

161

Я

002

STX

022

DC2

042

"

061

2

102

б

122

p

142

Б

162

P

003

ETX

023

DC3

043

#

063

3

103

ц

123

с

143

Ц

163

С

004

EOT

024

DC4

044

¤

064

4

104

д

124

т

144

Д

164

T

005

ENQ

025

NEK

045

%

065

5

105

e

125

у

145

E

165

У

006

ACK

026

SYN

046

&

066

6

106

ф

126

ж

146

Ф

166

Ж

007

BEL

027

ETB

047

'

067

7

107

г

127

в

147

Г

167

В

010

BS

030

CAN

050

(

070

8

110

x

130

ь

150

X

170

Ь

011

HT

031

ЕМ

051

)

071

9

111

и

131

ы

151

И

171

Ы

012

LF

032

SUB

052

*

072

:

112

й

132

з

152

Й

172

3

013

VT

033

ESC

053

+

073

;

113

к

133

ш

153

К

173

Ш

014

FF

034

FS

054

,

074

<

114

л

134

э

154

Л

174

Э

015

CR

035

GS

055

-

075

=

115

м

135

щ

155

H

175

Щ

016

SO

036

RS

056

.

076

>

116

н

136

ч

156

H

176

Ч

017

SI

037

US

057

/

077

?

117

о

137

ъ

157

О

177

Ъ

 

КОД RADIX50
Таблица 3

Обозначение символа

Восьмеричный код

Код RADIX-50

Пробел

40

0

А - Z

101 - 132

1 - 32

¤

44

33

.

56

34

Не используется

 

35

0 - 9

60 - 71

36 - 47

Пример преобразования последовательности символов X, 2, B в код RADIX-50:

.RAD50 /X2B/

В коде RADIX-50 получим следующее значение (арифметические действия выполняются в восьмеричной системе):

    X=113000
  + 2=002400
    B=000002
  X2B=115402
Таблица 4

Символ

Код одиночного или первого символа

Код второго символа

Код третьего символа

Пробел

000000

000000

000000

А

003100

000050

000001

В

006200

000120

000002

C

011300

000170

000003

D

014400

000240

000004

E

017500

000310

000005

F

022600

000360

000006

G

025700

000430

000007

H

031000

000500

000010

I

034100

000550

000011

J

037200

000620

000012

К

042300

000670

000013

L

045400

000740

000014

M

050500

001010

000015

N

053600

001060

000016

О

056700

001130

000017

P

062000

001200

000020

Q

065100

001250

000021

R

070200

001320

000022

S

073300

001370

000023

Т

076400

001440

000024

U

101500

001510

000025

V

104600

001560

000026

W

107700

001630

000027

X

113000

001700

000030

Y

116100

001750

000031

Z

121200

002020

000032

¤

124300

002070

000033

.

127400

002140

000034

Не используется

132500

002210

000035

0

135600

002260

000036

1

140700

002330

000037

2

144000

002400

000040

3

147100

002450

000041

4

152200

002520

000042

5

155300

002570

000043

6

160400

002640

000044

7

163500

002710

000045

8

166600

002760

000046

9

171700

003030

000047

ПРИЛОЖЕНИЕ 3
КОМАНДЫ АССЕМБЛЕРА

В данном приложении приведены команды Ассемблера: команды центрального процессора (табл. 1) и команды процессора с плавающей запятой (табл. 2).

КОМАНДЫ ЦЕНТРАЛЬНОГО ПРОЦЕССОРА
Таблица 1

Мнемоника

Код команды

Операция

ADC

005500

Прибавление переноса

ADCB

105500

Прибавление переноса к байту

ADD

060000

Сложение

ASH

072000

Арифметический сдвиг

ASHC

073000

Арифметический сдвиг двойного слова

ASL

006300

Арифметический сдвиг влево

ASLB

106300

Арифметический сдвиг влево байта

ASR

006200

Арифметический сдвиг вправо

ASRB

106200

Арифметический сдвиг вправо байта

BCC

103000

Ветвление, если нет переноса

BCS

103400

Ветвление, если перенос

BEQ

001400

Ветвление, если равно (нулю)

BGE

002000

Ветвление, если больше или равно (нулю)

BGT

003000

Ветвление, если больше (нуля)

BHI

101000

Ветвление, если больше

BHIS

103000

Ветвление, если больше или равно

BIC

040000

Очистка разрядов

BICB

140000

Очистка разрядов байта

BIS

050000

Логическое сложение

BISB

150000

Логическое сложение байтов

BIT

030000

Проверка разрядов

BITB

130000

Проверка разрядов байта

BLE

003400

Ветвление, если меньше или равно (нулю)

BLO

103400

Ветвление, если меньше

BLOS

101400

Ветвление, если меньше или равно

BLT

002400

Ветвление, если меньше (нуля)

BMI

100400

Ветвление, если минус

BNE

001000

Ветвление, если не равно (нулю)

BPL

100000

Ветвление, если плюс

BPT

000003

Командное прерывание для отладки

BR

000400

Ветвление безусловное

BVC

102000

Ветвление, если нет арифметического переполнения

BVS

102400

Ветвление, если арифметическое переполнение

CALL

004700

Обращение к подпрограмме (JSR PC,XXX)

CALLR

000100

Безусловная передача управления

CCC

000257

Очистка всех разрядов (N,Z,V,C)

CLC

000241

Очистка C

CLN

000250

Очистка N

CLR

005000

Очистка

CLRB

105000

Очистка байта

CLV

000242

Очистка V

CLZ

000244

Очистка Z

CMP

020000

Сравнение

CMPB

120000

Сравнение байтов

COM

005100

Инвертирование

COMB

105100

Инвертирование байта

DEC

005300

Вычитание единицы

DECB

105300

Вычитание единицы из байта

DIV

071000

Деление

EMT

104000

Программное прерывание для системных программ

FADD

075000

Сложение с плавающей запятой

FDIV

075030

Деление с плавающей запятой

FMUL

075020

Умножение с плавающей запятой

FSUB

075010

Вычитание с плавающей запятой

HALT

000000

Останов

INC

005200

Прибавление единицы

INCB

105200

Прибавление единицы к байту

IOT

000004

Командное прерывание для ввода-вывода

JMP

000100

Безусловная передача управления

JSR

004000

Обращение к подпрограмме

MARK

006400

Восстановление УС

MFPI

006500

Пересылка из предыдущей области команд

MFPS

106700

Чтение ССП

MFPT

000007

Модель процессора

MOV

010000

Пересылка

MOVB

110000

Пересылка байта

MTPI

006600

Пересылка в предыдущую область команд

MTPS

106400

Запись ССП

MUL

070000

Умножение

NEG

005400

Изменение знака

NEGB

105400

Изменение знака байта

NOP

000240

Нет операции

RESET

000005

Сброс внешних устройств

RETURN

000207

Возврат из подпрограммы (RTS PC)

ROL

006100

Циклический сдвиг влево

ROLB

106100

Циклический сдвиг влево байта

ROR

006000

Циклический сдвиг вправо

RORB

106000

Циклический сдвиг вправо байта

RTI

000002

Возврат из прерывания

RTS

000200

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

RTT

000006

Возврат из прерывания

SBC

005600

Вычитание переноса

SBCB

105600

Вычитание переноса из байта

SCC

000277

Установка всех разрядов (N,Z,V,C)

SEC

000261

Установка C

SEN

000270

Установка N

SEV

000262

Установка V

SEZ

000264

Установка Z

SOB

077000

Вычитание единицы и ветвление

SUB

160000

Вычитание

SWAB

000300

Перестановка байтов

SXT

006700

Расширение знака

TRAP

104400

Командное прерывание

TST

005700

Проверка

TSTB

105700

Проверка байта

TSTSET

007200

 

WAIT

000001

Ожидание

WRTLCK

007300

 

XOR

074000

Исключающее ИЛИ

 

КОМАНДЫ ПРОЦЕССОРА С ПЛАВАЮЩЕЙ ЗАПЯТОЙ
Таблица 2

Мнемоника

Код команды

Операция

ABSD

170600

Вычисление абсолютного значения числа с двойной точностью

ABSF

170600

Вычисление абсолютного значения числа с одинарной точностью

ADDD

172000

Сложение с двойной точностью

ADDF

172000

Сложение с одинарной точностью

CPCC

170000

Копирование признаков ПЗ

CLRD

170400

Очистка с двойной точностью

CLRF

170400

Очистка с одинарной точностью

CMPD

173400

Сравнение с двойной точностью

CMPF

173400

Сравнение с одинарной точностью

DIVD

174400

Деление с двойной точностью

DIVF

174400

Деление с одинарной точностью

LDCDF

177400

Загрузка и преобразование числа с двойной точностью в число с одинарной точностью

LDCFD

177400

Загрузка и преобразование числа с одинарной точностью в число с двойной точностью

LDCID

177000

Загрузка и преобразование короткого числа в число с двойной точностью

LDCIF

177000

Загрузка и преобразование короткого числа в число с одинарной точностью

LDCLD

177000

Загрузка и преобразование длинного числа в число с двойной точностью

LDCLF

177000

Загрузка и преобразование длинного числа в число с одинарной точностью

LDD

172400

Загрузка с двойной точностью

LDEXP

176400

Загрузка порядка

LDF

172400

Загрузка с одинарной точностью

LDFPS

170100

Загрузка слова состояния программы ПЗ

MFPD

106500

Пересылка из предыдущей области данных

MODD

171400

Умножение и целочисленное представление с двойной точностью

MODF

171400

Умножение и целочисленное представление с одинарной точностью

MTPD

106600

Пересылка в предыдущую область данных

MULD

171000

Умножение с двойной точностью

MULF

171000

Умножение с одинарной точностью

NEGD

170700

Изменение знака числа с двойной точностью

NEGF

170700

Изменение знака числа с одинарной точностью

SETD

170011

Установка режима двойной точности

SETF

170001

Установка режима одинарной точности

SETI

170002

Установка режима короткого числа

SETL

170012

Установка режима длинного числа

SPL

000230

Установка уровня приоритета

STA0

170005

 

STB0

170006

 

STCDF

176000

Запись с преобразованием числа с двойной точностью в число с одинарной точностью

STCDI

175400

Запись с преобразованием числа с двойной точностью в короткое число

STCDL

175400

Запись с преобразованием числа с двойной точностью в длинное число

STCFD

176000

Запись с преобразованием числа с одинарной точностью в короткое число

STCFI

175400

Запись с преобразованием числа с одинарной точностью в короткое число

STCFL

175400

Запись с преобразованием числа с одинарной точностью в длинное число

STD

174000

Запись с двойной точностью

STEXP

175000

Запись порядка

STF

174000

Запись с одинарной точностью

STFPS

170200

Запись слова состояния программы

STST

170300

Запись состояния ПЗ

SUBD

173000

Вычитание с двойной точностью

SUBF

173000

Вычитание с одинарной точностью

TSTD

170500

Проверка с двойной точностью

TSTF

170500

Проверка с одинарной точностью

 

ПРИЛОЖЕНИЕ 4
МЕТОДЫ АДРЕСАЦИИ

В таблице данного приложения приведены методы адресации языка Ассемблер.

Таблица

Формат

Адресация

Метод адресации

R

0N

Регистровый

@R или (ER)

1N

Косвенно-регистровый

(ER)+

2N

Автоинкрементный

@(ER)+

3N

Косвенно-автоинкрементный

-(ER)

4N

Автодекрементный

@-(ER)

5N

Косвенно-автодекрементный

E(ER)

6N

Индексный

@E(ER)

7N

Косвенно-индексный

#E

27

Непосредственный

@#Е

37

Абсолютный

E

67

Относительный

@E

77

Косвенно-относительный

В вышеприведённой таблице N определяет используемый регистр.

 

ПРИЛОЖЕНИЕ 5
ДИРЕКТИВЫ АССЕМБЛЕРА

В таблице данного приложения приведены директивы Ассемблера.

Таблица

Мнемоника

Назначение

.ASCII

Используется для записи последовательности символов в коде КОИ-7

.ASCIZ

Используется для записи последовательности символов в коде КОИ-7 с добавлением нулевого байта в конце последовательности символов

.ASECT

Используется для определения абсолютной программной секции

.BLKB

Используется для резервирования области памяти (в байтах) в объектной программе

.BLKW

Используется для резервирования области памяти (в словах) в объектной программе

.BYTE

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

.CROSS

Используется для управления печатью и содержанием таблицы перекрёстных ссылок

.CSECT

Используется для определения перемещаемой именованной или неименованной программной секции

.DSABL

Используется для запрещения выполнения заданных функций трансляции

.ENABL

Используется для разрешения выполнения заданных функций трансляции

.END

Используется для указания логического конца исходного модуля

.ENDC

Используется для указания конца блока условной трансляции

.ENDM

Используется для указания конца макроопределений или блока повторений

.ENDR

Используется для указания конца блока повторений

.ERROR

Используется для печати предусмотренных сообщений в листинге программы

.EVEN

Используется для установления чётного значения счётчика адреса

.FLT2

Используется для записи десятичных чисел в форме с плавающей точкой с обычной точностью

.FLT4

Используется для записи десятичных чисел в форме с плавающей точкой с двойной точностью

.GLOBL

Используется для описания имён как глобальных

.IDENT

Используется для дополнительного обозначения объектного модуля

.IF

Используется для указания начала блока условной трансляции

.IFF

Используется только внутри блока условной трансляции и указывает на начало блока, который будет транслироваться, если значение условия ложное

.IFT

Используется только внутри блока условной трансляции и указывает на начало блока, который будет транслироваться, если значение условия истинное

.IFTF

Используется только внутри блока условной трансляции и указывает на начало блока, который будет транслироваться независимо от значения условия

.IIF

Используется для создания блока условной трансляции, содержащего одно предложение

.INCLUDE

Используется для ввода исходного файла в транслируемый файл

.IRP

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

.IRPC

Используется для определения области неопределённых повторений с заменой отдельных символов

.LIBRARY

Используется для включения имени файла макробиблиотеки пользователя в список просматриваемых Ассемблером библиотек

.LIMIT

Используется для резервирования двух слов памяти для записи младшего адреса загрузочного модуля и старшего адреса загрузочного модуля плюс два

.LIST

Используется для разрешения печати полей листинга, определённых аргументами

.MACRO

Используется для указания начала макроопределения

.MCALL

Используется для указания имён макроопределений из макробиблиотек, которые используются в исходной программе

.MDELETE

Используется для стирания указанных макроопределений и освобождения виртуальной памяти

.MEXIT

Используется для завершения текущего макрорасширения или области неопределённых повторений

.NARG

Используется для определения числа параметров в макрокоманде

.NCHR

Используется для определения числа символов в указанной последовательности символов

.NLIST

Используется для запрещения печати полей листинга, определённых аргументами

.NTYPE

Используется для определения метода адресации указанного параметра макрокоманды

.NOCROSS

Используется для управления печатью и содержанием таблицы перекрёстных ссылок

.ODD

Используется для установления нечётного значения счётчика адреса

.PAGE

Используется для печати текста с новой страницы листинга

.PACKED

Используется для упаковки десятичных данных в одно слово

.PRINT

Используется для печати в листинге программы предусмотренных сообщений

.PSECT

Используется для создания именованных или неименованных перемещаемых или абсолютных программных секций и распределения данных между программными секциями

.RADIX

Используется для установления основания системы счисления всей исходной программы или её части

.RAD50

Используется для упаковки последовательности символов в код RADIX-50

.REPT

Используется для указания начала области повторений

.REM

Используется для ввода комментария в исходную программу

.RESTORE

Используется для восстановления из стека контекста программной секции

.SBTTL

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

.SAVE

Используется для сохранения в стеке контекста программной секции

.TITLE

Используется для присваивания имени объектному модулю

.WORD

Используется для записи данных в последовательно расположенных словах

.WEAK

Используется для описания имён как внешних

 

ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ

  1. Операционная система ФОДОС-2
    Описание применения
    589.7545471.00042-01 31 01
  2. Операционная система ФОДОС-2
    Системная макробиблиотека
    Руководство программиста
    589.7545471.00042-01 33 01
  3. Операционная система ФОДОС-2
    Ассемблер
    Руководство программиста
    589.7545471.00042-01 33 02
  4. Операционная система ФОДОС
    Ассемблер
    Описание языка
    ПГЩ.00010-01 35 01
  5. Центральный процессор "ЭЛЕКТРОНИКА МС1601"
    Система команд
    Техническое описание и инструкция по эксплуатации
    Часть 2
    ПГЩМ3.858.143 ТО2