Команды побитовой обработки

 

ЭВМ Систем 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

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

 
Статьи раздела