Пересылка символьной информации

{toc_noshowall}Рассмотрев форму представления символьных данных в машине и способ определения символьных констант, перейдем теперь к изучению команд, ориентированных на побайтовую обработку. Мы познакомимся с командами еще не известных нам форматов, SS и SI.Первыми рассмотрим команды МVС и MVI соответственно.

КОМАНДА MVC

Команда MVC (Move Character — ПЕРЕСЫЛКА) принадлежит к командам формата SS. Это означает, что оба ее операнда располагаются в памяти, ссылки на них в явной форме предполагают указание базы и смещения. Можно производить ссылки на эти операнды и неявно, указывая соответствующие им перемещаемые имена или выражения. В этом случае определение значения смещения и номера базового регистра выполняется ассемблером.

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

MoVe Character

D1+(B1)(D2 + (B2))L1

По команде MVC можно производить пересылку содержимого от 1 до 256 байтов, расположенных последовательно, начиная с байта, имеющего адрес D2+(B2), в область соответствующей длины, начинающуюся байтом с адресом D1+(B1). Количество байтов задается полем LI. L символически обозначает длину первого операнда. В нашем описании команды тот факт, что производится пересылка содержимого L1 байтов, отмечен помещением индекса L1 в поле выражения D2+(B2). Выполнение команды MVC не влияет на состояние признака результата.

Если поле, имеющее длину, определяемую L1, и начинающееся байтом D1+(B1), не имеет пересечений с полем такой же длины, начало которого имеет адрес D2+(B2), то выполнение команды MVC сводится к простому копированию содержимого второго поля в первое. При этом начальное содержимое первого поля теряется. Использование неявной формы задания операндов подразумевает следующую форму записи команды:

MVC S1(L1),S2

S1 и S2 в данном случае — перемещаемые имена или выражения. Можно также явно задавать адрес первого операнда, неявно — адрес второго, и наоборот. После выполнения ассемблером команды

DIGITS DC CL10'0123456789'

в область памяти, начинающуюся байтом DIGITS, будет записан код EBCIDIC строки

0123456789

По команде

LETTERS DC CL10'ABCDEFGHIJ'

код строки

ABCDEFGHIJ будет записан в память, начиная с байта LETTERS.

Предположим, что мы хотим переслать содержимое первых 5 байтов второй области на место первых 5 байтов первой. L1 в данном случае равно 5, DIGITS — адрес первого операнда, LETTERS — второго. Команда MVC, необходимая для выполнения требуемых действий, выглядит так:

MVC DIGITS(5), LETTERS

По окончании работы по этой команде содержимое первых 5 байтов области LETTERS будет скопировано в первые 5 байтов области DIGITS. В результате область DIGITS будет содержать код EBCDIC строки

ABCDE56789

Если вместо написанной команды MVC выполнить другую MVC DIGITS+4(3), LETTERS

то получится строка

0123АВС789

Пусть теперь снова в области DIGITS находится код EBCDIC строки 0123456789, а в области LETTERS код строки ABCDEFGHIJ. Выполним команду „

MVC DIGITS+2(6),LETTERS+2

По окончании выполнения в поле DIGITS получится код EBCDIC, соответствующий строке

01DEFGHI89

Проиллюстрируем теперь возможность явного задания операндов в команде МУС. Пусть содержимое последовательных ячеек памяти, начиная с ячейки с адресом 20000, в шестнадцатеричном представлении выглядит так:

F301406872816081

а содержимое поля, начинающегося ячейкой с адресом 20500, так:

0123456789АBCDЕF0123

Пусть, кроме того,

(3)=00020000

а

(6)=00020500

к моменту начала выполнения команды

МVС 2(4,3),4(6)

По окончании ее выполнения содержимое четырех последовательных байтов, начинающихся байтом с адресом 4+(6)=4+20500=20504, будет скопировано в область памяти, начинающуюся байтом с адресом 2+(3)=2+20000 =20002. Содержимое последовательных ячеек памяти, первая из которых имеет адрес 2000Q, будет таким:

F30189АBCDЕF6081

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

Такая интерпретация команды МУС поможет нам разобраться в ситуации* когда области памяти, задаваемые в поле операндов пересекаются. Пусть в области А хранится следующая информация

A: F0683479428C3

Выполнение команды

МVС А+1(5),А

даст

A: F0F0F0F0F0F0C3

Содержимое первого байта копируется в последующие пять байтов. Для того чтобы понять, почему это произошло, предположим, что мы в состоянии уследить за пересылкой содержимого каждого байта. Сначала содержимое байта А попадает в байт А+1:

затем содержимое А+1 — в А+2:

затем А+2 — в А+3:

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

В случаях когда число подлежащих перемещению байтов совпадает с числом, указанным в команде DS или DC, параметр L1 может быть опущен. В таких случаях говорят о подразумеваемой длине, значение которой (на самом деле уменьшенное на 1, как будет видно из следующей главы) записывается ассемблером в память в поле длины при трансляции команды MVC.

Предположим, что в программу включены команды

AREA1 DS CL5

AREA2 DC CL8'KITTYCAT'

По команде

МVC AREA1,AREA2

содержимое первых пяти байтов AREA2 будет скопировано в AREA1. Таким образом, выполнение этой команды эквивалентно выполнению

МVC AREA1(5),AREA2

Иными словами, если количество пересылаемых байтов не определено, ассемблер использует в качестве него количество байтов первого операнда. Часто то, что полуслова, полные и двойные слова имеют соответственно длины в 2, 4 и 8 байтов, оказывается очень удобным при работе с подразумеваемой длиной в команде МУС.

Вообще говоря, MVС (MoVe Character) было бы правильнее назвать MVB (MoVe Byte), поскольку это название более четко отражает суть дела. По команде МУС производится пересылка содержимого последовательных ячеек памяти независимо от того, представляет собой это содержимое код EBCDIC некоторой строки или нет. Предположим, что содержимое слова APPLES необходимо поместить по адресу ORANGES. Наиболее эффективным способом достижения этого независимо от смысла пересылаемой информации является использование команды

МVС ORANGES(4), APPLES

Команда MVCL, предусмотренная в системе IBM 370, является обобщением команды МУС. С ее помощью можно производить пересылку содержимого до 16777216 байтов одной области в другую и заполнять память символом-заполнителем.

Если вас интересует более детальная информация по рассматриваемому вопросу, обратитесь к разд. 20.1.

 

При символьной обработке содержимое единственного байта часто приобретает большое значение. Так, например, мы уже знаем, что с помощью команды MVC можно заполнить всю область памяти кодом какого-либо символа. Команда MVI часто используется для помещения желаемого содержимого в первый байт заполняемой области. Команда MVI — это первая рассматриваемая нами команда формата SI. Первый операнд указывается адресным полем S-типа, в явной или неявной форме, второй же операнд является непосредственным операндом и представляет собой один байт информации.

Этот байт, конечно, не может быть использован в качестве адреса. Он представляет собой сам операнд. По команде MVI (Move Immediate — ПЕРЕСЫЛКА НЕПОСРЕДСТВЕННАЯ) производится загрузка байта, указанного в качестве второго операнда, по адресу, заданному первым операндом. Признак результата при этом не меняется.

MVI D1(B1),I2

MoVe Immediate

D2 + (B1)12

12 является символическим обозначением явно задаваемого байта. Задать непосредственный операнд можно несколькими способами. Обычно команда MVI используется для записи кода некоторого символа в память в качестве константы. Например, по команде

MVI А1,С'Т'

код EBCDIC символа Т будет записан в память по адресу А1. Этот код может быть также записан в шестнадцатеричном, Х'Е3', двоичном, В'11100011', или десятичном, 227, представлении. Поэтому каждая из следующих команд эквивалентна предыдущей:

MVI А1,Х'ЕЗ'

MVI А1, В' 11100011'

MVI А1,227

Если до выполнения одной из этих команд мы имели

Al: C2C1D9

то по окончании будет получен результат

A1: E3C1D9

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

MVI 0(5),С"

обеспечивает засылку кода 4016 по адресу 0+(5). Заполнение оставшихся 149 байтов производится по команде »

MVC 1(149,5),0(5)

 

В некоторых случаях для временного хранения и обработки символьной информации удобно использовать регистры. По команде IC (Insert Character — ПРОЧИТАТЬ СИМВОЛ), которая является командой формата RX, содержимое адресуемого байта помещается в последние восемь разрядов (с 24 по 31) регистра, определяемого в качестве первого операнда.

IC R1,D2(X2,B2)

Insert Character

R124-31(D2 + (X2) + (B2))C

В приведенном описании С обозначает 1 байт, а индекс 24—31 указывает на загружаемую часть R1. Биты с 0 по 23 при выполнении команды 1C не изменяются.

По команде STC (Store Character — ЗАПИСЬ В ПАМЯТЬ СИМВОЛА) происходит перемещение 8 разрядов из регистра по указанному адресу.

STC R1,D2(X2,B2)

STore Character

(R1)24-31D2 + (X2) + (B2)

Работа с символьной информацией не требует выполнения каких-либо правил выравнивания.

Команды IC и STC можно использовать при выполнении арифметических операций над содержимыми отдельных байтов.

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

IC 3,BYTE

АН 3,=Н'1'

STC 3,BYTE

Из материала гл. 20 можно узнать, что в машинах IBM 370 предусмотрены также команды ICM и STCM, представляющие собой обобщения команд IC и STC соответственно.