Сравнение символьных данных

 

{toc_noswhoall}Символьная обработка часто подразумевает сортировку символьных данных и поиск строк, содержащих определенный контекст. Поэтому нам необходимо познакомиться с некоторыми командами сравнения символьных данных, ориентированными на побайтовую обработку.

КОМАНДА CLC

В команде CLC (Compare Logical Character — СРАВНЕНИЕ КОДОВ) порядок указания операндов точно такой же, как и в команде MVC. Оба операнда, как и во всех командах формата SS, выбираются из памяти; кроме того, необходимо указать длину в байтах необходимых нам областей.

CLC D1(L1 ,B1),D2(B2)

Compare Logical Character

Сравнить (D1+(B1))L1 с (D2 + (В2))L1 и произвести установку признака результата

По команде CLC содержимое строки, длина которой в байтах определяется полем L1 команды и начинающейся по адресу D1+B1, сравнивается с содержимым поля этой же длины, начало которого имеет адрес D2+(B2). При этом логическом сравнении операнды, длина которых может достигать 256 байтов, рассматриваются как целые без знака, т. е. первые биты сравниваемых чисел не являются знаковыми. Тем самым все сравниваемые целые без знака рассматриваются как положительные. Наибольшим целым без знака, умещающимся в одном байте, является 111111112, а наименьшим — 000000002 (если бы эти числа рассматривались как обычные целые, то первое представляло бы число — 1, а второе — 0). При логическом сравнении полуслово С863, например, «больше», чем 4632; при обычномарифметическом сравнении мы получили бы противоположный результат.

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

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

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

Результат

0

Операнды равны

1

1-й операнд < 2-й операнд

2

1-й операнд > 2-й операнд

3

Не устанавливается

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

Предположим, что в памяти хранится следующая информация:

А: СЗС1Е34040

В: D9C1Е34040

При выполнении указываемых команд получатся следующие признаки результата:

 

Команда

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

CLC

А (5),В

1

CLC

А+1 (3),В

0

CLC

А (4),В+1

2

CLC

B(4),А

2

В качестве иллюстрации применения команды CLC на рис. 10.1 приведен фрагмент программы автоматического перевода с немецкого языка на английский. 4000-байтовая строка, хранящаяся в памяти, начиная с ячейки с адресом GERMAN, последовательно проверяется на наличие сочетаний bDIEb, bDERb и bDENb. При обнаружении на их место записывается сочетание bТНЕЬ. Три команды CLC используются для выявления нужных немецких слов. Замена производится по команде MVC. Заметим, что мы использовали литерал

= С'ТНЕ'

в качестве операнда команды MVC. Мы могли с тем же успехом написать

MVC 0(5,9),THEWD

 

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

внеся в программу дополнительно предложение

THEWD DC С'ТНЕ'

В гл. 20 будет также рассматриваться команда CLCL.

 

Команда CLI (Compare Logical Immediate — СРАВНЕНИЕ КОДОВ НЕПОСРЕДСТВЕННОЕ) является командой формата SI и служит для выполнения логического сравнения. Сравниваются адресуемый и непосредственно указываемый байты.

CLI DI(B1),I2

Compare Logical Immediate

Сравнить (D1+(B1))с I2 и установить признак результата

Сравнение снова производится по правилам арифметики целых без знака. В случаях когда содержимое байта, имеющего указанный адрес, совпадает с непосредственно заданным числом, оказывается меньше или больше его, вырабатывается признак результата 0,1 или 2 соответственно. Например, по команде

CLI 5(3),С'Т'

производится сравнение содержимого байта, имеющего адрес 5+(3), с кодом EBCDIC символа Т, Х'ЕЗ'. Если в результате сравнения получился признак 1, то, значит, проверяемый символ предшествует Т в алфавите, так как код проверяемого символа меньше кода Т. Появление нуля в качестве признака результата означало бы, что содержимое исследуемого байта равно Х'Е3', а появление 2,— что содержимое байта больше кода символа Т.

Рис. 10.2. Программа подсчета количества кодов буквы М в 200-байтовом поле с адресом TEXT.

Предположим, что в памяти, начиная с байта'LETTERS, хранится следующая информация:

C5D5E640

Выполнение указанных в таблице команд привело бы к установке следующих признаков результатов:,

 

Команда

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

CLI

LETTERS,C'E'

0

CLI

LETTERS + 2,B'11100101

2

CLI

LETTERS + 3,X'40'

0

CLI

LETTERS,C''

2

CLI

LETTERS+ 1 ,C'N'

0

CLI

LETTERS+ 3,X'00'

1

На рис. 10.2 приведена программа, подсчитывающая количество появлений кода буквы М в области памяти, имеющей длину 200 байтов и начинающейся по адресу TEXT. Адресные поля S-типа не содержат ссылки на индексный регистр. Таким образом, при организации циклической работы необходимо задавать адреса операндов в явной форме, поскольку только так можно получить возможность модификации этих адресов во время выполнения программы.