ЭВМ Систем 360 и 370 обеспечивают возможность выполнения операций И, ИЛИ и Сложение по модулю 2. Для этого существуют специальные команды. При этом каждой операции могут соответствовать команды различных типов. Мнемониками команд формата RX, реализующих операции И, ИЛИ и Сложение по модулю 2, являются соответственно N, О и X. Каждой из этих операций отвечают, кроме того, команды форматов RR, SI и SS. Из табл. 14.1 видно, что мнемоники для различных типов команд, реализующих данную операцию, получаются просто добавлением букв R,I или С к основной мнемонике. Итак, всего существует 12 логических команд, по три команды каждого из четырех типов.
Операция |
Формат команды |
RX |
RR |
SI |
SS |
AND |
N |
NR |
NI |
NC |
|
OR |
O |
OR |
OI |
OC |
|
XOR |
X |
XR |
XI |
XC |
Таблица 14.1. Мнемоники для логических операций
Табл. 14.2. показывает, что все логические команды имеют тот же вид, что и уже рассмотренные арифметические команды и команды пересылки. Результат выполнения команды всегда помещается по адресу первого указанного в ней операнда. Операндами команд формата RX являются один из регистров общего назначения и полное слово памяти. Результат помещается в R1. Команды формата RR позволяют производить логические операции над содержимыми двух регистров общего назначения. Результат опять же помещается в регистр первого операнда.
Таблица 14.2. Логические команды
Команды формата SI оперируют с байтами, один из которых находится в памяти, а другой указывается непосредственно в команде. Результат записывается в память на место первого операнда. Так же как и в случае команд MVC и CLC, длина операндов логических команд формата SS определяется содержимым поля L1, являющегося частью поля первого операнда. Выполнение операции в данном случае побайтовое, т. е. на каждом шаге выполнения используются соответствующие два байта операндов команды. Сами логические операции производятся над каждой парой битов в уже рассмотренном порядке. Значение L1 может лежать в пределах от 1 до 256.
Содержимое табл. 14.1 и 14.2 трудно запомнить; однако, зная все типы команд и порядок задания их операндов, можно быстро научиться правильно использовать все необходимые логические операции. Пусть, например, мы хотим логически сложить содержимые двух 10- байтовых областей памяти. Нам известны адреса размещения этих областей, и поэтому следует применить команду ИЛИ формата SS. Длина в данном случае равна 10. Если А — адрес начала первой области, а В — адрес начала второй, то требуемая команда выглядит следующим образом:
ОС А(10),В
Результат логического сложения будет размещен в 10-байтовой области памяти, начинающейся по адресу А. Исходное содержимое А при этом будет утеряно. Содержимое области В останется неизменным.
Приведем еще несколько примеров. Предположим, что поля Р и Q выровнены по границам слов и их содержимое выглядит так:
Р: 0FCA0FF0CE6B
Q: A0F0A0F0A0F0
Предположим далее, что
(2) = ААААСССС
(3) = OFOFOFOF
Ниже будет рассмотрено несколько команд. При этом предполагается, что к моменту начала выполнения каждой из них регистры 2 и 3, а также области памяти Р и Q имеют определенное выше содержимое.
После выполнения команды
NR 2,3
получится
(2)=0А0А0С0С
а после выполнения команды
OR 3,2
получится
(3)=AFAFCFCF
Команда
XR 2,3
позволяет, не изменяя все четные полубайты регистра 2, заменить все нечетные их дополнениями. Итак, результат ее выполнения таков:
(2) =А5А5СЗСЗ
Заметим, что с помощью операции И можно выделять интересующие нас биты некоторой области. Говорят, что операция И «маскирует» разряды аргумента, умножаемые на в. Пусть, например, мы хотим, записать в регистр 3 информацию о содержимом всех четных полубайтов области Р. Это можно сделать с помощью команды
N 3,Р
(Предполагается, что (3) совпадает с определенным выше.) В результате получится
(3) =OFOAOFOO
Как работает команда
ХС P+2(3),Q+1
Она производит поразрядное сложение по модулю 2 областей, начинающихся по адресам Р+2 и Q+1. Результат помещается на место первого операнда. После выполнения этой команды будем иметь
Р: 0FCAFF503E6B
Рассмотрим выполнение этой команды более подробно. Содержимое трехбайтового поля, начинающегося по адресу Р+2, выглядело к моменту начала выполнения так:
0 1111 1111 0000 1100 1110
Ниже приведено содержимое области, начинающейся байтом Q+1, на тот же момент:
1111 0000 1010 0000 1111 0000
(Для большей ясности вся информация представлена в двоичной форме.) Выполнение поразрядного сложения по модулю 2 даст
1111 1111 0101 0000 ООП 1110
Результат будет записан по адресу Р+2, т. е. туда, где вначале был
расположен первый операнд.
Мы используем команды, работающие с непосредственными операндами, при необходимости выполнения операций над определенными Разрядами байта. Например, для того чтобы установить в 1 разряды с третьего по пятый байта D, оставляя все остальные без изменения, следует написать
1 D,B'00011100
Аналогично предположим, что требуется в первые пять разрядов байта, имеющего адрес на 16 превышающий указанный в регистре 6, установить комбинацию 11000, не изменяя содержимого остальных разрядов. Для этого нужно последовательно выполнить две команды:
1 16(6), В'11000000'
N1 16(6),В'1100011Г
Первая заменяет первые два из интересующих нас битов на единицы, вторая — помещает в разряды 2, 3 и 4 нули.
Достаточно часто приходится производить анализ содержимого отдельных разрядов или групп разрядов. Например, некоторая группа может использоваться в качестве переключателя, т. е. для определения последовательности дальнейшей работы. Значения переключателя могут устанавливаться и изменяться с помощью логических операций. В определенные моменты содержимое данной группы проверяется, и таким образом выясняется, что же необходимо делать дальше.
Команда ТМ (Test under Mask — ПРОВЕРИТЬ ПО МАСКЕ) обеспечивает возможность выполнения подобной проверки. ТМ является командой формата SI, ее первым операндом является S-адрес исследуемого байта. С помощью непосредственного операнда можно определять интересующие нас разряды этого байта.
ТМ D1 (В 1), 12 |
Test under Mask |
Проверить содержимое D1 +(В1), используя 12 в качестве маски. Установить СС в соответствии с результатом. |
Если некоторый разряд маски содержит 1, то это означает, что соответствующий разряд байта D1+(B1) должен быть проверен. Нулевое значение бита маски говорит о том, что соответствующий бит исследуемого байта в операции не участвует.
После выполнения команды ТМ признак результата вырабатывается по следующим правилам:
СС=0: 1. Все интересующие нас биты равны 0 или2. Значение маски — 0.
СС= 1: Среди исследуемых битов есть как нулевые, так и единичные.
СС=2: Не встречается.
СС=3: Все исследуемые разряды содержат 1.
Непосредственно вслед за ТМ могут быть выполнены команды: BZ, если требуется осуществить переход по значению переключателя
0, и ВО, если производится проверка на единичное значение переключателя. (В данном случае мнемоника ВО может трактоваться как «Переход по единице» — Branch if Ones.) Наконец, с помощью команды ВМ (Branch if Mixed) можно произвести проверку на наличие промежуточной ситуации.
Рассмотрим теперь пример:
ТМ BYTl.B'00110000'
В данном случае исследуется содержимое байта BYT1. Маска говорит
о том, что проверены должны быть всего лишь два бита: 2 и 3. Если BYT1 имеет вид
11110001
то в результате выполнения команды будет выработан признак результата 3 (оба исследуемых разряда содержат 1). В случае же, когда BYT1 выглядит как
11010001
в результате выполнения команды ТМ признак результата будет установлен равным 1, свидетельствуя о том, что биты 2 и 3 имеют различные значения. Наконец, если BYT1 содержит
11000001
то будет выработан нулевой признак результата. Маска отмечает разряды, содержимое которых необходимо проверить. Содержимое разрядов, не отмеченных в ней, игнорируется.