Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

IBM370

.pdf
Скачиваний:
36
Добавлен:
02.06.2015
Размер:
5.21 Mб
Скачать

2 – не бывает;

3 – не бывает.

Программные прерывания:

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

спецификация;

доступ (выборка второго операнда и запись в память на место второго операнда).

Замечания по программированию

Команду СРАВНЕНИЕ С ОБМЕНОМ можно применять в программах, осуществляющих сов-

местное использование общих областей памяти в мультипрограммном или мультипроцессор-

ном режиме. Ниже приведены два примера такого применения.

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

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

вое значение и помещается в другой общий регистр. После этого выполняется команда СРАВНЕНИЕ С ОБМЕНОМ, у которой поле R1 задает регистр. содержащий первоначальное значение, а поле R3 задает регистр, содержащий новое значение. Если устанавливается при-

знак результата, равный нулю, то это означает. что требуемое изменение было успешно вы-

полнено. Признак результата, равный единице, показывает, что во время выполнения команды СРАВНЕНИЕ С ОБМЕНОМ данная ячейка памяти уже не содержала первоначального значе-

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

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

Команда СРАВНЕНИЕ С ОБМЕНОМ может применяться для контролируемого совместного использования общей области памяти подобно тому, как это описано в замечаниях по про-

граммированию для команды ПРОВЕРИТЬ И УСТАНОВИТЬ, но в отличие от последней она обеспечивает дополнительную возможность оставлять сообщение, если данная общая область уже используется. Чтобы осуществить это, слово из памяти может быть использовано в каче-

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

а положительное значение, отличное от нуля, говорит о том, что область используется и что само это значение является адресом самого последнего сообщения, внесенного в список со-

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

гут использовать команду СРАВНЕНИЯ С ОБМЕНОМ для изменения значения управляющего слова. Изменение производится с целью показать, что общая область используется, или для внесения сообщения в список. Только программа, получившая доступ в указанную область,

211

может без риска использовать команду СРАВНЕНИЕ С ОБМЕНОМ также и для того, чтобы убрать сообщения из списка.

Нужно отметить, что команда СРАВНЕНИЕ С ОБМЕНОМ не блокирует обращения каналов к памяти. Отсюда следует, что эта команда не должна использоваться для изменения слова, ес-

ли все оно или его часть находится в области ввода, так как входные данные могут быть поте-

ряны.

СРАВНЕНИЕ ДВОЙНОЕ С ОБМЕНОМ

CDS

R1,R3,D2(B2)

[RS]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦ BB

 

¦

R1

¦

R3

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

Производится сравнение первого и второго операндов. Если они равны друг другу, третий операнд записывается в память на место второго операнда. Если они не равны, второй опе-

ранд помещается на место первого операнда.

Каждое из полей R1 и R3 задает пру общих регистров. Второй операнд представляет собой двойное слово в основной памяти.

В зависимости от результата сравнения всех 64 разрядов (равенства или неравенства)

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

мять, и никакие действия, связанные с установкой бита изменения и защитой памяти, не произ-

водятся.

Если имеет место равенство, то в период от момента выборки второго операнда для срав-

нения и до момента записи в память третьего операнда на место второго запрещаются обра-

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

Перед выборкой второго операнда для сравнения и – в случае установки признака резуль-

тата, равного нулю, – после записи результата в память выполняется временная отмена сов-

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

шены все предыдущие обращения к основной памяти по отношению к каналам и к другим про-

цессорам. Только после этого производится выборка второго операнда. До тех пор пока не бу-

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

шению к каналам и другим процессорам не производится.

Каждое из полей R1 и R3 должно задавать четный номер регистра. Второй операнд должен быть расположен на границе двойного слова. При нарушении этих требований фиксируется особый случай спецификации и операция подавляется.

Признак результата:

0 – первый и второй операнды равны, второй операнд замещен третьим;

1 – первый и второй операнды не равны, первый операнд замещен вторым;

212

2 – не бывает;

3 – не бывает.

Программные прерывания:

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

спецификация;

доступ (выборка второго операнда и запись в память на место второго операнда).

Замечания по программированию

В замечаниях по программированию, относящихся к команде СРАВНЕНИЕ С ОБМЕНОМ,

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

да СРАВНЕНИЕ ДВОЙНОЕ С ОБМЕНОМ.

Кроме того, эта команда может иметь другое применение. Пусть имеется списочная струк-

тура, а также управляющее слово, содержащее адрес первого сообщения в этом списке (по-

добная организация описана во втором примере использования команды СРАВНЕНИЕ С ОБМЕНОМ). Если нескольким программам разрешено добавлять и убирать сообщения с по-

мощью команды СРАВНЕНИЕ С ОБМЕНОМ, то существует вероятность разрушения цепочки взаимных ссылок. Это может произойти в следующей ситуации. После того как одна программа выбрала адрес самого последнего сообщения с целью удаления его из списка, друга програм-

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

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

нился.

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

держит адрес первого сообщения, а другая – счетчик числа изменений, увеличивающийся вся-

кий раз, когда происходит изменение списка, и использовать команду СРАВНЕНИЕ ДВОЙНОЕ С ОБМЕНОМ для одновременного изменения обоих полей управляющего слова, то вероят-

ность разрушения цепочки становится пренебрежимо малой.

Нужно отметить, что команда СРАВНЕНИЕ ДВОЙНОЕ С ОБМЕНОМ не блокирует обраще-

ния каналов к памяти. Отсюда следует, что эта команда не должна использоваться для изме-

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

СРАВНЕНИЕ ПОЛУСЛОВА

CH

R1,D2(X2,B2)

[RX]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦

49

¦

R1

¦

X2

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

213

Первый операнд сравнивается со вторым операндом, и в зависимости от результата срав-

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

ривается как целое число со знаком, состоящее из 16 разрядов, включая знаковый.

Перед сравнением второй операнд расширяется до 32 разрядов путем присвоения старшим

16 битам значения знакового разряда.

Сравнение выполняется алгебраически, сравниваемые операнды рассматриваются как це-

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

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

Признак результата:

0 – операнды равны;

1– первый операнд меньше;

2– первый операнд больше;

3– не бывает.

Программные прерывания:

доступ (выборка второго операнда).

СРАВНЕНИЕ КОДОВ

CLR

R1,R2

 

[RR]

 

 

 

 

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

 

 

 

¦

15

¦

R1

¦

R2

¦

 

 

 

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

 

 

 

0

7

8

11

12

15

 

 

 

 

 

 

 

 

CL

R1,D2(X2,B2)

[RX]

 

 

 

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

 

 

 

¦

55

¦

R1

¦

X2

¦

B2

¦

D2

¦

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

 

 

 

0

7

8

11

12

15

16

19

20

 

31

 

 

 

CLI

D1(B1),I2

[SI]

 

 

 

 

 

 

 

 

+-------------------------------

 

 

 

 

 

 

 

+

 

 

 

 

 

¦

95

¦

I2

¦

B1

¦

D1

¦

 

 

 

 

 

+-------------------------------

 

 

 

 

 

 

 

+

 

 

 

 

 

0

7

8

15

16

19

20

 

31

 

 

 

 

 

CLC

D1(L,B1),D2(B2)

[SS]

 

 

 

 

 

 

+----------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

+

¦

D5

¦

L

¦

B1

¦

 

D1

¦

B2

¦

D2

¦

+----------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

+

0

7

8

15

16

19

20

 

31

32

35

36

 

47

214

Первый операнд сравнивается со вторым операндом, и в зависимости от результата срав-

нения устанавливается признак результата.

Сравниваемые операнды рассматриваются как двоичные величины без знака, и любые ко-

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

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

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

ной части операнда.

Признак результата:

0 – операнды равны;

1– первый операнд меньше;

2– первый операнд больше;

3– не бывает.

Программные прерывания:

доступ (выборка второго операнда в команда CL и CLC, выборка первого операнда в коман-

дах CLI и CLC).

Замечания по программированию

Команда СРАВНЕНИЕ КОДОВ характерна тем, что все биты обрабатываются как элементы двоичной величины без знака. В операции с полями переменной длины максимальная длина сравниваемой информации составляет 256 байтов. Операция может быть использована для сравнения десятичных упакованных полей без знака или буквенно-цифровой информации. По-

следняя может быть представлена в любом коде, который образует упорядоченную последо-

вательность, основанную на возрастающих или убывающих двоичных величинах. Например, в

расширенном двоично-кодированном десятичном коде EBCDIC буквы и цифры упорядочены по принципу возрастания двоичных значений кодов1.

СРАВНЕНИЕ СИМВОЛОВ ПО МАСКЕ

CLM

R1,M3,D2(B2)

[RS]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦ BB

 

¦

R1

¦

M3

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

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

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

215

В качестве маски используется содержимое поля M3, занимающее биты 12–15 кода коман-

ды. Четыре бита маски слева направо соответствуют четырем байтам, находящимся в общем регистре, заданном полем R1. Байты, соответствующие единичным битам маски, рассматрива-

ются как непрерывное поле, которое сравнивается со вторым операндом. Второй операнд яв-

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

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

Сравниваемые операнды рассматриваются как двоичные величины без знака, и любые ко-

ды являются допустимыми. Операция выполняется слева направо.

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

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

ная часть заданного операнда позволяет завершить операцию, то нельзя заранее сказать, бу-

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

Признак результата:

0 – выделенные байты первого операнда совпадают со вторым операндом или маска равна нулю;

1 – содержимое выделенного поля первого операнда меньше;

2 – содержимое выделенного поля первого операнда больше;

3 – не бывает.

Программные прерывания:

доступ (выборка второго операнда).

СРАВНЕНИЕ КОДОВ ДЛИННОЕ

CLCL

 

R1,R2

[RR]

+--------------------

 

 

 

 

+

¦ 0F

 

¦

R1

¦

R2 ¦

+--------------------

 

 

 

 

+

0

7

8

11

12

15

Первый операнд сравнивается со вторым операндом, и в зависимости от результата срав-

нения устанавливается признак результата. Считается, что более короткий операнд расширя-

ется с помощью символов-заполнителей.

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

Адреса самых левых байтов первого и второго операндов находятся в разрядах 8–31 общих регистров, заданных полями R1 и R2 соответственно. Длины операндов в байтах содержатся в разрядах 8–31 общих регистров, имеющих адреса, на 1 большие, чем адреса регистров, за-

216

данных полями R1 и R2. Биты 0–7 регистра R2+1 содержат символ-заполнитель, а содержимое битов 0–7 регистров R1, R1+1 и R2 игнорируется.

Сравниваемые операнды рассматриваются как двоичные величины без знака, и любые ко-

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

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

Выполнение команды может быть прервано. Если прерывание происходит после заверше-

ния элемента операции, не являющегося последним, содержимое регистров R1+1 и R2+1

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

ки прерывания.

При прерывании старшие байты в регистрах R1 и R2 устанавливаются равными нулю, значе-

ние старших байтов в регистрах R1+1 и R2+1 остается без изменения и значение признака ре-

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

Если операция заканчивается из-за несовпадения, то при ее завершении поля счетчиков и адресов указывают первый не совпавший байт. Содержимое разрядов 8–31 регистров R1+1 и

R2+1 уменьшается на число совпавших байтов, за исключением случая, когда несовпадение относится к символу-заполнителю; при этом поле счетчика более короткого операнда устанав-

ливается равным нулю. Содержимое разрядов 8–31 регистров R1 и R2 увеличивается на то же число, на которое уменьшены поля счетчиков. Если оба операнда с учетом возможного исполь-

зования символа-заполнителя равны, то при завершении операции оба поля счетчика устанав-

ливаются равными нулю, а адреса увеличиваются на соответствующие начальные значения счетчиков. Биты 0–7 в регистрах R1 и R2 устанавливаются равными нулю, включая случай, ко-

гда одно или оба первоначальных значения счетчиков равны нулю. Содержимое битов 0–7 ре-

гистров R1+1 и R2+1 остается без изменения.

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

нако доступная часть операнда позволяет завершить операцию, то нельзя заранее сказать, бу-

дет ли зафиксирован особый случай, относящийся к недоступной части операнда.

Если значение поля счетчика какого-либо операнда равно нулю, никакие особые случаи до-

ступа для этого операнда не фиксируются.

Признак результата:

0 – операнды равны или оба они имеют нулевую длину;

1– первый операнд меньше;

2– первый операнд больше;

217

3 – не бывает.

Программные прерывания:

доступ (выборка первого или второго операнда);

спецификация.

Замечания по программированию

Если поля R1 и R2 задают одну и ту же пару регистров, то устанавливается признак резуль-

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

рандов, фиксируются.

В тех случаях, когда команда СРАВНЕНИЕ КОДОВ ДЛИННОЕ должна выполняться с помо-

щью команды ВЫПОЛНИТЬ, необходимо принимать специальные меры предосторожности.

Они рассматриваются в замечаниях по программированию, относящихся к команде ВЫПОЛНИТЬ.

Дополнительные сведения приведены в замечаниях по программированию, относящихся к команде ПЕРЕСЫЛКА ДЛИННАЯ.

ПРЕОБРАЗОВАНИЕ В ДВОИЧНУЮ

CVB

R1,D2(X2,B2)

[RX]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦ 4F

 

¦

R1

¦

X2

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

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

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

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

ся к данным, и вызывает программное прерывание. Десятичный операнд занимает в памяти 8

байтов. Четыре младших бита поля используются для представления знака. Остальные 60 би-

тов содержат 15 цифр в двоично-десятичном коде. Упакованный формат десятичных данных описан в главе 10.

Результат преобразования помещается в общий регистр, заданный полем R1. Наибольшее число, которое может быть преобразовано и помещено в общий регистр, равно 2147483647;

наименьшее число равно –2147483648. Для любого десятичного числа, выходящего за указан-

ные пределы, операция преобразования завершается тем, что в регистр помещаются 32

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

Признак результата не изменяется.

Программные прерывания:

218

доступ (выборка второго операнда);

 

 

 

данные;

 

 

 

 

 

 

 

 

 

деление с фиксированной точкой.

 

 

 

ПРЕОБРАЗОВАНИЕ В ДЕСЯТИЧНУЮ

 

 

CVD

R1,D2(X2,B2)

[RX]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦ 4E

 

¦

R1

¦

X2

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

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

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

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

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

мяти 8 байтов. Младшие 4 бита этого поля используются для представления знака. Положи-

тельный знак кодируется комбинацией 1100, отрицательный – комбинацией 1101. Остальные

60 разрядов содержат 15 цифр в двоично-десятичном коде.

Число, подлежащее преобразованию, берется из общего регистра и представляет собой целое число со знаком, состоящее из 32 разрядов, включая знаковый. Так как для десятичного эквивалента двоичного 31-разрядного числа отводится 15 десятичных цифр, переполнение возникнуть не может.

Признак результата не изменяется.

Программные прерывания:

доступ (запись второго операнда).

ДЕЛЕНИЕ

DR

R1,R2

[RR]

 

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

¦

1D

¦

R1

¦

R2

¦

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

0

7

8

11

12

15

 

 

 

 

 

D

R1,D2(X2,B2)

 

[RX]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦

5D

¦

R1

¦

X2

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

Делимое (первый операнд) делится на делитель (второй операнд), и частное с остатком

помещается на место делимого.

219

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

ной полем R1 кода команды. Если в поле R1 указан нечетный номер регистра, имеет место осо-

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

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

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

Знак частного определяется по правилам алгебры. Остаток имеет тот же знак, что и дели-

мое, однако нулевой остаток и нулевое частное всегда положительны. Если соотношение меж-

ду величинами делимого и делителя таково, что для выражения частного со знаком не хватает

32 разрядов, отмечается особый случай деления с фиксированной точкой (происходит про-

граммное прерывание, деление не выполняется и делимое в общих регистрах остается без изменения).

Признак результата не изменяется.

Программные прерывания:

доступ (выборка второго операнда в команде D);

спецификация;

деление с фиксированной точкой.

ИСКЛЮЧАЮЩЕЕ ИЛИ

XR

R1,R2

[RR]

 

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

¦

17

¦

R1

¦

R2

¦

 

 

 

 

+--------------------

 

 

 

 

 

+

 

 

 

 

0

7

8

11

12

15

 

 

 

 

 

X

R1,D2(X2,B2)

 

[RX]

 

 

 

 

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

¦

57

¦

R1

¦

X2

¦

B2

¦

D2

¦

+--------------------------------------

 

 

 

 

 

 

 

 

 

+

0

7

8

11

12

15

16

19

20

 

31

XI

D1(B1),I2

[SI]

 

 

 

 

 

+-------------------------------

 

 

 

 

 

 

 

 

+

 

¦

97

¦

I2

¦

B1

¦

D1

 

¦

 

+-------------------------------

 

 

 

 

 

 

 

 

+

 

0

7

8

15

16

19

20

 

31

 

 

220

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]