Атрибуты и SET-переменные

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

АТРИБУТЫ

Любые имена имеют связанные с ними атрибуты, или описательные параметры. В качестве примеров атрибутов можно рассмотреть тип имени (адрес, команда, константа), длину идентифицируемого объекта в байтах, количество символов в имени. Атрибуты могут встречаться только в выражениях, являющихся операндами команд типа 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-переменных.

Статья 423 - Картинка 1

Рис. 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

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