В качестве подготовки к изучению дальнейших вопросов, связанных с условным ассемблированием, рассмотрим некоторые дополнительные возможности ассемблера.
АТРИБУТЫ
Любые имена имеют связанные с ними атрибуты, или описательные параметры. В качестве примеров атрибутов можно рассмотреть тип имени (адрес, команда, константа), длину идентифицируемого объекта в байтах, количество символов в имени. Атрибуты могут встречаться только в выражениях, являющихся операндами команд типа SETx, или в предложениях условного ассемблирования.
Для ссылки на атрибут некоторой символической переменной мы пишем букву, соответствующую данному атрибуту, за ней апостроф и имя переменной. Например, для ссылки на тип переменной &SYM нужно написать T'&SYM.
Значением атрибута тип является символьная константа, состоящая из одной буквы. Табл. 18.1 содержит перечень наиболее часто встречающихся типов. Атрибут длины переменной &SYM записывается так L'&SYM.
Таблица 18.1 Некоторые типы переменных
А Адресная константа А-типа
В Двоичная константа
С Символьная константа
Е Константа с плавающей точкой (одинарная точность)
F Двоичное число в формате полного слова
Н Двоичное число в формате полуслова
I Машинная команда
N Самоопределенный терм (например, число или непосредственный операнд)
О Опущенный операнд
Р Упакованная десятичная константа
V Адресная константа V-типа
X Шестнадцатеричная константа
Атрибуты относятся к значению символического параметра, присвоенному с помощью данной макрокоманды. Пусть мы определили макро с именем CALC, предложение-прототип которого выглядит как
&LABL CALC &A,&B,&C,&D,&E
Пусть, кроме того, написана макрокоманда
COMPUTE CALC 3,LETTS,.AGAIN,NUM
где LETTS,AGAIN и NUM определены в программе как
LETTS DC CL43'ERROR NUMBER 38'
AGAIN В OVER
NUMDS 10F
Атрибуты параметров в данном случае имеют следующие значения:
Атрибут Значение
T'&D 'I`
Т'&Е 'F'
L'&E 40
Т'&С 'О'
Т'&А 'N'
L'&B 43
Т'&В 'С'
SET-переменные
Имена символических параметров задаются ассемблеру с помощью предложения-прототипа, значения параметрам присваиваются в макрокоманде. В языке ассемблера встречаются также SET-переменные, значения которым присваиваются с помощью предложений SETx (что такое х будет вскоре объяснено). С помощью предложений SETx можно выполнять арифметические, логические и символьные операции над различными переменными. Значения SET-переменных могут быть использованы для модификации машинных команд и других предложений программы. В дальнейшем мы увидим, что с помощью предложений условного ассемблирования можно производить проверки результатов подобных вычислений и в зависимости от них организовать передачи управления и циклы в процессе макрогенерации и ассемблирования.
Перед использованием любой SET-переменной ее надо определить как SET-переменную, чтобы ассемблер не считал ее с символическим параметром. Для определения SET-переменных служат предложения LCLx и GBLx. Глобальные SET-переменные (GIoBaL) сохраняют свое значение внутри всей программы, в которой они определены, причем входная информация ассемблеру должна начинаться с определений глобальных SET-переменных.
Рис. 18.6. Расположение предложений GBL и LCL в макроопределении и программе.
Локальные SET-переменные (LoCaL) сохраняют свои значения лишь внутри тех макро, в которых они были определены. Поэтому локальные переменные, пусть даже с одинаковыми именами, но определенные внутри различных макро, являются на самом деле различными. На рис. 18.6 изображена структура входных данных ассемблера, в которых определены две глобальные SET-переменные &Р и &Q, а также макро PCALC, использующее локальные переменные &R и &S. Форматы предложений GBLx и LCLx выглядят соответственно как
GBLx имя
и
LCLxимя
где «имя» — это имя символической переменной.
SET-переменные, как глобальные, так и локальные, могут быть трех типов: арифметические, булевы и символьные. Они называются соответственно SETA-, SETB- и SETC-переменными, поскольку именно такие команды применяются для присвоения им значений. Тип предложений LCLx и GBLx должен совпадать с типом переменных — LCLA или GBLA для SETA-переменных, LCLB или GBLB для SETB- переменных и т. д.
SETA-переменные используются для выполнения арифметических операций над символическими переменными. SETA-переменные всегда имеют целые значения, которые, будучи использованы в качестве операндов машинных команд, принимают вид десятичных целых. Формат SETA-предложения имеет вид
имя SETA выражение
Результатом выполнения такой команды является присвоение помеченной переменной значения, определяемого выражением, находящимся в правой части SETA. Например, если&В является SETA- переменной и имеет значение 100, то
&А SETA &В*10 —20
присваивает значение 980 SETA-переменной&А (&А должно быть предварительно определено с помощью предложения LCLA или GBLA). Выражение может содержать различные символические переменные и константы,, соединенные знаками операции +, —, * и /. Выражение может также содержать атрибуты, имеющие числовые значения, например длину. Если &С— символический параметр и &CLEN — SETA-переменная, то в результате выполнения команды
&CLEN SETA L'&C—10
переменной &CLEN присваивается значение на 10 меньшее, чем атрибут длины значения, присвоенного &С. Если затем в качестве одного из модельных предложений выступает
MVC&B.(&CLEN),&C
то полученное переменной &CLEN значение будет внесено в поле длины команды MVC.
SETB-переменные могут иметь лишь одно из двух значений: 0 или
1. Для присвоения SETB-переменным значений используются предложения, имеющие формат
имя SETB выражение
В данном случае под выражением понимается логическое выражение, которое мы рассмотрим в разд. 18.3. Если логическое выражение имеет значение «истина», то переменной, имя которой указано в поле имени SETB-предложения, присваивается значение 1, если «ложь» — то 0.
SETC-переменным значения присваиваются с помощью предложений вида
имя SETC выражение
В данном случае под выражением понимается строка символов, которая может быть образована конкатенацией нескольких строк. Каждая подстрока заключается в апострофы, за исключением случаев, когда рассматриваемое выражение, такое, как, например, атрибут типа, имеет символьную форму. Пусть, например, &CHARS представляет собой SETC-переменную. Предложение
&CHARS SETC T'&IN.'AB'.&GST
присваивает &CHARS значение
1ABCD
если типом &IN являетсяТ и &GST — SETC-переменная, имеющая значение CD.
SETA-переменные, использующиеся для формирования операндов машинных команд или SETC-выражений, ведут себя как символьные представления соответствующих десятичных чисел. Может встретиться и обратная ситуация: SETC-переменные могут замещать цепочки цифр в SETA-выражении.
Как мы увидим в дальнейшем, локальные SET-переменные используются в основном внутри макро. Глобальные SET-переменные используются всякий раз при необходимости ссылаться на некоторые параметры с помощью символических имен внутри всей программы. Например, подпрограмма $$Ю составлена так, что она выполняет свои функции независимо от длины строки реально использующегося печатающего устройства. Длина строки задается при ассемблировании $$IO.
Такая задача может, например, быть решена путем введения глобальной переменной &CHRPLN, значение которой будет совпадать с количеством символов в строке. Первым предложением программы будет
GBLA &CHRPLN
Значение переменной &CHRPLN можно присвоить,например, так:
&CHRPLNSETA 133
Всюду в программе, где необходимы ссылки на длину строки, можно теперь использовать SET-переменную &CHRPLN:
LINEOUT DC CL&CHRPLN.' '
MVC LINEOUT + 1(&CHRPLN —1),LINEOUT
Таким образом, введенная переменная &CHRPLN встречается в программе пять или шесть раз. Для того чтобы теперь использовать 120-символьное печатающее устройство вместо 132-символьного, достаточно заменить одно предложение программы, написав
&CHRPLNSETA 121
Это значительно удобнее и надежнее, чем изменение значения длины строки везде, где оно встречается в программе.