АССЕМБЛЕР.
ОПИСАНИЕ ЯЗЫКА.
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.
Символ |
Название |
---|---|
|
Пробел |
: |
Двоеточие |
= |
Равно |
% |
Процент |
# |
Признак числа |
@ |
Коммерческое ЭТ |
- |
Минус |
( |
Круглая скобка левая |
) |
Круглая скобка правая |
. |
Точка |
, |
Запятая |
; |
Точка с запятой |
< |
Меньше |
> |
Больше |
+ |
Плюс |
* |
Звёздочка |
/ |
Дробная черта |
& |
Коммерческое И |
! |
Восклицательный знак |
" |
Кавычки |
' |
Апостроф |
^ |
Стрелка вверх |
\ |
Обратная дробная черта |
4.1.4.1. Разделительные и ограничительные символы
В табл. 2 приведены допустимые разделительные и ограничительные символы.
Символ |
Определение |
Назначение |
---|---|---|
Пробелы |
Один или более пробелов и/или символов ГТ |
Допустимый разделитель для операндов. Пробелы внутри выражения игнорируются |
, |
Запятая |
Допустимый разделитель для выражений и операндов |
<…> |
Парные символы "<" и ">" |
Используются для выделения аргумента, в частности, если в аргументе уже использованы разделительные символы. Символы "<" и ">" могут использоваться в любом месте программы для ограничения выражения, рассматриваемого как терм |
^\...\ |
Конструкция с символом ^ |
Эта конструкция эквивалентна символам "<" и ">" и обычно используется там, где аргумент уже содержит эти символы |
Параметры макрокоманд могут быть представлены в различной форме в зависимости от их использования.
При составлении программ необходимо соблюдать следующие правила:
- если параметры не содержат разделительные символы, то они отделяются запятыми;
- если параметры содержат разделительные символы или пробелы, то они могут быть заключены в символы "<" и ">". Внешняя пара символов "<" и ">" аннулируется при использовании параметра;
- если параметр содержит разделительные символы, включая символы "<" и ">", то параметр можно записать, используя конструкцию вида ^\...\, где в качестве ограничителя "\" может быть использован любой символ. Символ "^" и ограничители при использовании параметра опускаются. Следует иметь в виду, что независимо от способа записи каждого из параметров, друг от друга параметры необходимо отделять запятыми.
4.1.4.2. Символы управления форматом
Управление форматом текста программы по горизонтали осуществляется с помощью символов пробел и ГТ. Эти символы не влияют на процесс трансляции, если они не являются составной частью имени, числа, аргумента директивы .ASCII, или, если эти символы не используются в качестве ограничителя операции.
Предложение может быть записано следующим образом:
LABEL:MOV(SP)+,ТАG;выборка данного из стека
или, используя символы управления форматом:
LABEL: MOV (SP)+,TAG ; выборка данного из стека
Использование символов пробел и ГТ в предложениях позволяет сделать программу более удобной для чтения.
Управление форматом листинга программы по вертикали, т.е. размером страницы в N строк, осуществляется вводом кода символа ПФ после N-ой строки. Если код ПФ отсутствует, страница автоматически заканчивается через каждые 58 строк.
4.1.4.3. Символы операций
В табл. 3 приведены символы одноместных операций (операций с одним членом).
Символ |
Операция |
|
Пример записи |
---|---|---|---|
+ |
Плюс |
+A |
положительное значение, эквивалентно А |
- |
Минус |
-А |
отрицательное значение А, двоичное дополнение |
^ |
Указатель специальной операции |
^F3.0 |
интерпретируется как однословное число с плавающей запятой 3.0 |
^C24 |
интерпретируется как обратный код числа 24 |
||
^D127 |
интерпретируется как десятичное число 12710 |
||
^O34 |
интерпретируется как восьмеричное число 34 |
||
^B11000111 |
интерпретируется как двоичное 11000111 |
Символы одноместных операций могут быть объединены друг с другом в одном терме, например:
^C^O12 -^O5
В табл. 4 приведены символы двухместных операций (операций с двумя членами).
Символ |
Операция |
Пример записи |
---|---|---|
+ |
Сложение |
А+В |
- |
Вычитание |
А-В |
* |
Умножение |
A*B (результат - 16-разрядное произведение) |
/ |
Деление |
A/B (результат - 16-разрядное частное) |
& |
Логическое И |
А&В |
! |
Логическое ИЛИ |
А!В |
Все двухместные операции имеют одинаковый приоритет. Деление и умножение выполняются над числами со знаком.
Термы в выражении могут быть сгруппированы и заключены в символы "<" и ">".
Термы, заключённые в символы "<" и ">", вычисляются первыми, остальные операции выполняются последовательно слева направо, например:
.WORD 1+2*3 ; 11 восьмеричное .WORD 1+<2*3> ; 7 восьмеричное
4.1.5. Недопустимые символы
Символы считаются недопустимыми в одном из следующих случаев:
- символ, который не принадлежит набору символов Ассемблера, всегда
является недопустимым и вызывает печать символа "?"
в соответствующей позиции текущей строки и печать сообщения об ошибке
"1" в листинге, например:
LABEL ю: MOV А,В
Так как буква "ю" не входит в набор символов Ассемблера, то вся строка транслируется как оператор .WORD LABEL, а в листинге печатается сообщение об ошибке;
- символ, допустимый для использования в Ассемблере, (т.е. символ, принадлежащий набору символов Ассемблера), при нарушении основных положений и синтаксиса языка может быть в контексте интерпретирован как недопустимый, и в листинге печатается сообщение об ошибке "Q".
4.2. Символические имена
4.2.1. Постоянные имена, имена пользователя и имена макрокоманд
В Ассемблере используются символические имена трех видов: постоянные имена, имена пользователя и имена макрокоманд. Соответственно формируется три типа таблиц: таблица постоянных имён, таблица имён пользователя и таблица макроимён.
Таблица постоянных имён содержит постоянные имена и входит в состав транслятора. Постоянными именами являются символические обозначения кодов команд и директив Ассемблера. Эти имена нет необходимости определять перед использованием в исходной программе.
Таблица имён пользователя и таблица макроимён создаются в процессе трансляции исходной программы.
К именам пользователя относятся имена, используемые в программе в качестве меток, и имена, определяемые с помощью оператора прямого присваивания. Эти имена добавляются в таблицу имён пользователя по мере того, как они встречаются в исходной программе при трансляции.
Имена макрокоманд добавляются в таблицу макроимён при трансляции по мере того, как они встречаются в исходной программе.
Имена, определяемые пользователем, и имена макрокоманд могут записываться только с помощью букв латинского алфавита, цифр, символа "¤" и точки. Любые другие символы для записи имён не допустимы.
Символы "¤" и "." зарезервированы для имён системных программ.
При формировании имён, определяемых пользователем, и имён макрокоманд необходимо придерживаться следующих правил:
- первый символ не должен быть цифрой, за исключением локальных меток;
- каждое имя должно быть единственным по первым шести символам;
- имя может содержать более шести символов, но седьмой и последующие символы проверяются только на допустимость и не принимаются во внимание при трансляции;
- пробелы, символы ГТ и недопустимые символы (например, буквы русского алфавита) нельзя включать в символические имена.
Числовое значение имени зависит от его использования в исходной программе.
Имя, встречающееся в поле операции, может относиться к любому из трех описанных выше видов символических имён. В этом случае для определения значения имени Ассемблер осуществляет поиск имени в таблицах имён в следующем порядке:
- таблица макроимён;
- таблица постоянных имён;
- таблица имён пользователя.
Поиск имён, встретившихся в поле операнда, осуществляется в следующем порядке:
- таблица имён пользователя;
- таблица постоянных имён.
Предполагается, что Ассемблер не должен обнаружить имя макрокоманды в поле операнда.
Такой порядок просмотра таблиц позволяет переопределить имя, содержащееся в таблице постоянных имён, как имя, определённое пользователем, или как имя макрокоманды. Одно и то же имя может быть использовано для обозначения и макрокоманды и метки.
4.2.1.1. Глобальные и локальные имена
Имена, определяемые пользователем, могут быть локальными и глобальными.
Глобальные имена определяются:
- с помощью директивы .GLOBL (являются её аргументами) ;
- с помощью символов "::" при определении метки;
- с помощью символов "==" или "==:" в операторе прямого присваивания.
Все остальные символические имена, определяемые пользователем в программе, являются локальными.
Среди локальных имён особое место занимают локальные метки (п. 4.2.3).
К глобальным именам происходит обращение для осуществления связи между объектными модулями внутри загрузочного модуля, который получают в результате связывания из нескольких объектных модулей.
Глобальное имя в программе может быть меткой и его абсолютное значение будет определено в процессе связывания объектных модулей.
Глобальное имя в программе может не являться меткой, и его значение будет определяться с помощью оператора прямого присваивания как значение выражения. Глобальное имя, определённое как метка, обычно является точкой входа.
4.2.1.2. Внутренние и внешние имена
Глобальные имена делятся на внутренние глобальные и внешние глобальные имена.
Глобальное имя, не определённое в данном объектном модуле, называется внешним. Оно должно быть определено в каком-то другом модуле, для которого уже будет называться внутренним.
Глобальное имя должно быть зафиксировано в качестве аргумента директивы .GLOBL как в объектном модуле, где это имя определено, так и в модуле, где оно используется как внешнее.
Поскольку Ассемблер обеспечивает возможность секционирования программ (п. 7.7), следует также рассматривать две категории глобальных имён:
- имена, относящиеся только к текущей секции программы;
- имена, используемые и другими программными секциями.
В обоих случаях имя должно быть определено к моменту трансляции текущего предложения, так как его значение может использоваться при вычислении выражения.
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¤, где N - целое число от 1 до 65535 (десятичное) включительно.
Примеры локальных меток:
1¤ 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 1¤ 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 1¤ 11 000030 000207 RTS PC
Рекомендуется использовать локальные метки от 1¤ до 29999¤.
Локальные метки от 30000¤ до 65535¤ могут формироваться автоматически в процессе трансляции макрокоманд (п. 8.3.3).
Блок локальных меток состоит из последовательности предложений и должен ограничиваться одним из следующих способов:
- начинаться с символической метки и заканчиваться символической меткой;
- начинаться с символической метки и заканчиваться одной из директив .PSECT .ASECT .CSECT;
- начинаться с символической метки, следующей за директивой .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. Виды выражений
Выражения могут быть абсолютными, перемещаемыми, внешними и составными перемещаемыми.
Абсолютное выражение определяется как:
- терм или несколько термов, являющихся константами;
- перемещаемое выражение или терм минус перемещаемый терм;
- несколько термов, являющихся метками, определёнными в абсолютной программной секции.
Перемещаемым выражением является выражение, значение которого фиксировано по отношению к базовому адресу перемещаемой программной секции, в которой находится это выражение. При связывании значение выражения меняется.
Перемещаемое выражение определяется как:
- перемещаемый терм;
- перемещаемый терм (метка или имя счётчика адреса перемещаемой программной секции), связанный знаком арифметической операции с абсолютным выражением.
Внешним выражением является выражение, которое содержит внешнее имя.
Внешнее выражение определяется как:
- внешний терм;
- внешний терм, связанный знаком арифметической операции с абсолютным термом;
- абсолютное выражение, связанное знаком операции сложения с внешним выражением.
Составное перемещаемое выражение содержит несколько перемещаемых или внешних термов.
Выражение является составным перемещаемым, если выполняется любое из следующих условий:
- выражение содержит глобальное имя и перемещаемое имя;
- выражение содержит более одного глобального имени;
- выражение содержит перемещаемые термы, принадлежащие различным программным секциям;
- значение, получающееся в результате вычисления выражения, имеет более одного уровня перемещения. Например, если перемещаемые имена TAG1 и TAG2, принадлежащие одной и той же программной секции, указаны в выражении вида TAG1+TAG2, то вводятся два уровня перемещения, так как при оценке каждого имени принимается во внимание смещение, получающееся в результате перемещения данной программной секции;
- для неопределённого глобального имени указана операция, отличная от сложения;
- для перемещаемого значения указана операция, отличная от сложения, вычитания, отрицания или дополнения.
Вычисление перемещаемых, внешних и составных перемещаемых выражений завершается во время связывания программных секций.
ПРИМЕЧАНИЕ. Пробелы внутри выражений могут иметь значение только между символами. Другими словами, выражения
А + В
и
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. Оператор прямого присваивания
Оператор прямого присваивания вычисляет выражение и присваивает полученное значение символическому имени.
Формат оператора прямого присваивания:
символическое имя = выражение
или
символическое имя == выражение
или
символическое имя =: выражение
или
символическое имя ==: выражение
Символическое имя принимает абсолютное или перемещаемое значение в зависимости от определяющего его выражения.
Выражение в операторе прямого присваивания может содержать только один уровень ссылки вперёд и не должно содержать ссылку на внешнее имя.
Операторы прямого присваивания, содержащие символы "==" и "==:", определяют имя как глобальное.
После того, как символическое имя определено с помощью оператора прямого присваивания, оно включается в таблицу имён пользователя.
Значение символического имени может быть переопределено последующим оператором прямого присваивания, если в операторе прямого присваивания используются символы "=" и "==". Если в операторе прямого присваивания используются символы "=:" или "==:", любая попытка изменить значение символического имени вызывает печать в листинге сообщения об ошибке "М".
При использовании оператора прямого присваивания должны соблюдаться следующие правила:
- символы "=", "==", "=:", "==:"отделяют имя от выражения, значение которого присваивается имени;
- оператор прямого присваивания обычно помещается в поле операции, перед ним может быть метка, а после него - комментарий;
- одним оператором прямого присваивания может быть определено только одно имя;
- допускается только один уровень ссылки вперёд, например,
X=Y Y=1
- оператор прямого присваивания, определяющий глобальное имя, не должен содержать ссылку вперёд.
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.
Введём следующие обозначения:
- E - выражение, как оно определено выше (см. п. 4.3.2);
- R - выражение для регистра. Это любое
выражение, содержащее терм, которому предшествует символ
%, или имя, предварительно присвоенное такому
терму.
Примеры:
R0=%0 ; регистр общего назначения 0 R1=%1 ; регистр общего назначения 1 R2=%2 ; регистр общего назначения 2
- ER - выражение для идентификации регистра, т.е. выражение, значение которого заключено в пределах от 0 до 7;
- А - выражение для указания метода адресации, занимающего 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" будет происходить следующее:
- выборка команды из ячейки 20;
- увеличение содержимого PC на 2 (PC=22), т.е. получение адреса ячейки, содержащей индексное слово;
- выборка индексного слова из ячейки с адресом 22;
- увеличение содержимого PC на 2 (PC=24) и исполнение команды, при котором адрес операнда источника будет определён как сумма содержимого PC и индексного слова, т.е. 24 + 54=100.
Использование относительного метода адресации позволяет получить программу позиционно независимую, т.е. работоспособность такой программы сохраняется при перемещении её в памяти ЭВМ.
6.1.12. Косвенно-относительный метод
Формат: @Е
Указатель адреса операнда задаётся с помощью PC и индексного слова. Этот метод адресации аналогичен относительному методу адресации, только сформированный адрес является указателем адреса операнда.
Это достигается использованием косвенно-индексного метода адресации применительно к PC.
Пример:
MOV @X,R0 ; занести в регистр 0 содержимое ячейки, ; адрес которой находится в X
6.1.13. Форматы методов адресации
Методы адресации, приведённые в табл. 5, не увеличивают длину команды.
Формат метода адресации |
Код метода адресации |
Наименование |
---|---|---|
R |
0N |
Регистровый |
@R или (ER) |
1N |
Косвенно-регистровый |
(ER)+ |
2N |
Автоинкрементный |
@(ER)+ |
3N |
Косвенно-автоинкрементный |
-(ER) |
4N |
Автодекрементный |
@-(ER) |
5N |
Косвенно-автодекрементный |
Методы адресации, приведённые в табл. 6, увеличивают длину команды на одно слово.
Формат метода адресации |
Код метода адресации |
Наименование |
---|---|---|
E(ER) |
6N |
Индексный |
@Е(ER) |
7N |
Косвенно-индексный |
#Е |
27 |
Непосредственный |
@#Е |
37 |
Абсолютный |
Е |
67 |
Относительный |
@Е |
77 |
Косвенно-относительный |
ПРИМЕЧАНИЯ:
- В графе "Код метода адресации" N - один из регистров общего назначения.
- Последние четыре метода адресации в качестве регистра общего назначения используют счётчик команд.
- С помощью директивы .ENABL AMA можно в процессе трансляции заменить относительный метод адресации на абсолютный метод адресации в командах программы (п. 7.2.1).
6.2. Адресация в командах ветвления
Команды ветвления вызывают передачу управления по адресу, являющемуся суммой текущего содержимого PC и смещения, умноженного на 2.
За текущее содержимое PC берётся адрес следующей команды.
Смещение записывается в команде ветвления в разрядах 0-7 и указывает после умножения на 2, на сколько слов нужно перейти от ячейки, адрес которой в данный момент содержится в PC. Седьмой разряд смещения является знаковым. Если он установлен, то смещение отрицательное и ветвление происходит в направлении уменьшения адресов, а если этот разряд очищен, то смещение положительное и ветвление происходит в направлении увеличения адресов программы.
Исполнительный адрес в команде ветвления аппаратно вычисляется следующим образом:
- формируется 16-разрядное слово, младший байт которого является смещением, а разрядам 15-8 присваивается значение знакового разряда смещения;
- полученное слово умножается на 2, т.е. образуется смещение, выраженное в словах, а не в байтах;
- результат складывается с содержимым PC для формирования исполнительного адреса.
Ассемблер выполняет обратную операцию для формирования смещения в байтах относительно заданного адреса.
При использовании команд ветвления необходимо следить за тем, чтобы не было:
- перехода из одной программной секции в другую;
- перехода по адресу, который определён как внешнее имя;
- перехода по адресу, который находится за пределами действия команды ветвления, т.е. смещение перехода должно быть в пределах от -12810 до +12810.
В случае нарушения одного из этих условий в соответствующей позиции текущей строки будет напечатано сообщение об ошибке "A" и установлено смещение 377 (восьмеричное).
6.3. Адресация в системных командах EMT и TRAP
В командах EMT и TRAP старший байт слова содержит код команды, а младший байт предназначен для передачи информации драйверам внутренних прерываний.
Если EMT (или TRAP) сопровождается выражением, то при трансляции значение этого выражения запоминается в младшем байте слова. Если значение выражения превышает значение 3778, оно усекается до 8 бит и печатается сообщение об ошибке "T".
7. ДИРЕКТИВЫ
В данном разделе описываются директивы языка Ассемблер (см. приложение 5), подразделяющиеся на:
- директивы управления листингом;
- директивы режима трансляции;
- директивы задания данных;
- директива управления системой счисления;
- директивы управления счётчиком;
- директива окончания;
- директивы секционирования;
- директивы описания имён;
- директивы условной трансляции;
- директивы управления файлами.
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 с аргументами управляют печатью полей листинга, задаваемых аргументами. Аргументы могут использоваться индивидуально или в комбинации друг с другом. Для любого аргумента, не включённого явно в директиву управления печатью листинга, используется соответствующее значение аргумента по умолчанию.
Аргумент |
Действие по умолчанию |
Функция |
---|---|---|
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), разделённых запятыми, пробелами или символами ГТ. |
Аргумент |
Действие по умолчанию |
Функция |
---|---|---|
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 для записи кодов символов должны использоваться символы "<" и ">".
Символ |
Код 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.
Аргумент |
Действие по умолчанию |
Значение |
---|---|---|
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 программных секций:
- одну абсолютную секцию .ABS., определяемую по умолчанию;
- одну неименованную перемещаемую программную секцию, определяемую по умолчанию;
- 25410 именованных программных секций.
Для каждой программной секции Ассемблер ведёт следующую информацию:
- имя программной секции;
- содержимое счётчика текущего адреса;
- максимальное встретившееся значение счётчика адреса;
- признаки программной секции, т.е. аргументы директивы .PSECT.
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).
Директива |
Значение признака директивы .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".
Условие |
Аргумент |
Блок транслируется, если |
---|---|---|
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.
Директива |
Назначение |
---|---|
.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".
ПРИМЕЧАНИЯ:
- В директиве .ENDM метка игнорируется.
- Директива .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. Локальные метки в макрорасширениях.
В качестве меток в макрорасширениях используются локальные метки, создаваемые Ассемблером автоматически. Такие метки записываются в возрастающем порядке в виде N¤ (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 |
- допустимое выражение, значение которого выводится на терминал при появлении директивы; |
|
текст |
- текст указанного сообщения, которое будет печататься на терминале. |
Сообщения, выводимые по директиве, содержат:
- сообщение об ошибке "P" (печатается только для директивы .ERROR);
- порядковый номер строки, содержащей директиву .ERROR;
- текущее значение счётчика адреса;
- значение выражения, указанного в директиве;
- исходную строку, содержащую директиву .ERROR.
Директива .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).
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 |
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 |
Ъ |
Обозначение символа |
Восьмеричный код |
Код 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
Символ |
Код одиночного или первого символа |
Код второго символа |
Код третьего символа |
---|---|---|---|
Пробел |
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).
Мнемоника |
Код команды |
Операция |
---|---|---|
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 |
Исключающее ИЛИ |
Мнемоника |
Код команды |
Операция |
---|---|---|
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 |
Используется для упаковки десятичных данных в одно слово |
|
Используется для печати в листинге программы предусмотренных сообщений |
.PSECT |
Используется для создания именованных или неименованных перемещаемых или абсолютных программных секций и распределения данных между программными секциями |
.RADIX |
Используется для установления основания системы счисления всей исходной программы или её части |
.RAD50 |
Используется для упаковки последовательности символов в код RADIX-50 |
.REPT |
Используется для указания начала области повторений |
.REM |
Используется для ввода комментария в исходную программу |
.RESTORE |
Используется для восстановления из стека контекста программной секции |
.SBTTL |
Используется для формирования оглавления и обозначения каждой страницы листинга |
.SAVE |
Используется для сохранения в стеке контекста программной секции |
.TITLE |
Используется для присваивания имени объектному модулю |
.WORD |
Используется для записи данных в последовательно расположенных словах |
.WEAK |
Используется для описания имён как внешних |
ПЕРЕЧЕНЬ ССЫЛОЧНЫХ ДОКУМЕНТОВ
- Операционная система ФОДОС-2
Описание применения
589.7545471.00042-01 31 01 - Операционная система ФОДОС-2
Системная макробиблиотека
Руководство программиста
589.7545471.00042-01 33 01 - Операционная система ФОДОС-2
Ассемблер
Руководство программиста
589.7545471.00042-01 33 02 - Операционная система ФОДОС
Ассемблер
Описание языка
ПГЩ.00010-01 35 01 - Центральный процессор "ЭЛЕКТРОНИКА МС1601"
Система команд
Техническое описание и инструкция по эксплуатации
Часть 2
ПГЩМ3.858.143 ТО2