Машинный язык

Форматы RR, RX и RS команд уже были рассмотрены в предыдущих главах. Этот раздел, содержащий информацию о форматах SS и SI машинных команд, завершает обсуждение основ машинного языка.

ФОРМАТ SI

Один из операндов команд формата SI хранится в памяти и адресуется полем S-типа, другой является непосредственным и указывается на месте второго операнда команд языка ассемблера. В машинных командах порядок операндов иной: адрес памяти следует занепосредственным операндом.

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

92C2D15E

Статья 394 - Картинка 1

где В представляет номер регистра, a D — значение смещения. В 4- байтовых командах формата SI под S-поле отводятся последние два байта. Во втором байте указывается непосредственный операнд, в первом, как всегда,— код операции. Итак, команды формата SI, которые на языке ассемблера записываются как

MOP D1 (В 1),12

(МОР — мнемоника кода операций) имеют следующий машинный формат:

Статья 394 - Картинка 2

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

Команды машинного языка имеют двоичную форму. Если непосредственный операнд задан как-нибудь иначе, то ассемблер преобразует его к двоичному виду перед записью на соответствующее место в машинной команде. Пусть, например, в качестве непосредственного операнда указано С'А', что означает условную запись кода EBCDIC символа А; на место операнда 12 в машинной команде ассемблер поместит сам этот код, а именно С116 (=110000012). Аналогично, если нами используется десятичная константа, то ассемблер приводит ее к двоичному виду и помещает в соответствующее место команды. Например, команда

MVI 12(7),С'Н'

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

92С8700С

а команда

CLI 100(10),64

в 9540А064

Как мы знаем, когда в качестве операнда указывается перемещаемое выражение, ассемблер определяет соответствующие номер базового регистра и значение смещения. Предположим, что базовым является регистр 13, а значение смещения для имени ВЕЕ равно 15016. В этом случае ассемблер преобразует команду

MVI ВЕЕ + 14,С'В'

к виду

92C2D15E

Формат SS

Статья 394 - Картинка 3

Для определения операндов команд МVС и CLC требуется задание двух адресов и длины областей. Оба операнда адресуются S-полями, занимающими по два байта в командах машинного языка. Длина задается двоичным целым без знака, занимающим один байт. Итак, если учесть еще место, необходимое для кода операции, то всего для записи команд формата SS потребуется 6-байтовое поле.

Два S-поля в соответствующем порядке занимают последние 4 байта команды. Следовательно, длина операндов указывается во втором байте. Машинный формат команды

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

выглядит так:

В гл. 10 говорилось, что по командам MVC и CLC можно производить пересылку или сравнение операндов длиной до 256 байтов. Это ограничение связано с тем, что под указатель длины операндов отведено всего 8 двоичных разрядов. Максимальным 8-разрядным целым без знака является 11111111=FF16=25510. Таким образом, так как в машинном языке длина операндов принимается на 1 большей числа, указанного в поле L1, то сравнивать и перемещать можно содержимое до 256 байтов. Другими словами, число, записываемое в поле длины рассматриваемых команд, на 1 меньше, чем действительное количество байтов в операндах.

Ассемблеру «известен» этот факт, поэтому он позволяет указывать в мнемонической записи команд на языке ассемблера длину операндов в явном виде. В процессе ассемблирования десятичное значение длины переводится в двоичную форму, из полученного результата вычитается единица и разность помещается во второй байт машинной команды.

Давая машине команду

MVC 6(20,3),5(12)

мы тем самым требуем переслать содержимое 20-байтового поля, начало которого имеет адрес, на 5 превышающий значение, находящееся в регистре 12, в поле той же длины, но начинающееся байтом 6+(3). Таким образом

D1 =6

В1 =3

L1 —1 = 1316

D2 = 5

В2 =С16

Таблица 11.1 Форматы машинных команд

Статья 394 - Картинка 4

Код операции, соответствующий команде MVC, равен D216. Таким образом, на машинном языке эта команда выглядит так:

D2133006С005

Адреса операндов, соответствующих перемещаемым выражениям, вычисляются так, как это уже было описано. Если имени BLKS соответствует значение смещения, равное 20016, и регистр 10 используется в качестве базового, то команда

MVC BLKS(50),40(6)

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

D231A2006028

а команда

CLC BLKS+100(30), BLKS+2 D51DA264A202

Резюме

Итак, мы познакомились с форматами команд всех пяти типов, а также с модифицированными RR- и RX-форматами команд BCR и ВС.

В табл. 11.1 перечислены все форматы команд, которые мы изучили в гл. 6, 8, 9 и 11. В табл. 11.2 приведены все сокращения, использованные в табл. 11.1. В табл. 11.1 приведен также модифицированный формат SS. Эта модификация используется в тех случаях, когда требуется отдельная спецификация длин двух областей. С некоторыми командами, имеющими подобный машинный формат, мы познакомимся в гл. 15.

Таблица 11.2 Мнемонические обозначения, используемые при описании команд

Мнемоника

Значение

MOP

Обобщенное обозначение операции в описании формата языка ассемблера

OP

8-битовый код операции в машинном языке

Rn

Регистровый операнд с номером п

Mn

Операнд-маска с номером п

Bn

Базовый регистр операнда с номером п

Dn

Смещение для операнда с номером п

Xn

Индекс-регистр операнда с номером п

Ln

Длина (в байтах) операнда с номером п

Sn

Перемещаемый символ или выражение для операнда в памяти с номером п, базовый регистр Вп и смещениеDn подразумеваются

Важно, чтобы вы хорошо усвоили материал, представленный в табл. 11.1 и 11.2, это вам очень пригодится впоследствии. Системы команд и возможности рассматриваемых нами ЭВМ слишком сложны, чтобы изучение языка ассемблера можно было свести к последовательному рассмотрению составляющих его команд. Из табл. 11.1 и 11.2 видно, что все команды имеют определенную структуру. Когда мы сталкиваемся с необходимостью применения еще не встречавшейся нам команды, правила записи ее на машинном языке и языке ассемблера легко определить, исходя из ее формата.

Например, команда LM является командой формата RS. Таким образом, ее операндами являются два регистра и один операнд в памяти. Законна ли следующая запись, если PLACE представляет собой перемещаемое имя:

LM 5,10,PLACE(3)

Ответ будет отрицательным. Адресация операнда, расположенного в памяти в командах формата RS, должна производиться с помощью поля S-типа. В приведенном выше примере регистр 3 предполагается использовать в качестве индексного, а индексация адресов S-типа невозможна. Таблица 11.1 поможет нам разобраться, почему дело обстоит именно так. Все пространство, предоставляемое форматом команды для задания операндов, целиком занимается номерами двух регистров и S-адресным полем. Таким образом, для номера индексного регистра просто не остается места.

В качестве другого примера рассмотрим команду ТМ формата SI. Следующие две ее формы записи некорректны:

ТМ PLACE(5), В' 10101010'

ТМ PLACE,PLACE+ 3

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

Попытаемся выяснить, как характеризуют команды их коды операции. В табл. 11.3 приведены коды операций некоторых команд и соответствующие им мнемонические обозначения. Используя эту таблицу, попытайтесь обнаружить связь между самими операциями й их кодами. Код операции является указанием процессору на то, что необходимо сделать для выполнения данной команды. Код операции должен содержать информацию о длине команды — это необходимо для установки правильного значения счетчика команд — и о ее типе, поскольку тип определяет местонахождение информации о каждом из операндов. Ну и, наконец, код операции показывает, какие действия следует выполнить над этими операндами.

Первые два бита кода операции полностью определяют длину команды и сужают возможный выбор их типов. Из табл. 11.3 видно, что значение первых двух битов для команд RR равно 00.

Таблица 11.3 Некоторые коды операций.

Код операции

Олина(б байтах)

Мнемоника

Название

Двоичн.

Шестн.

Формат

А

Add

01011010

RX

4

AR

Add Register

00011010

RR

2

АР

Add Decimal

11111010

FA

SS

6

L

Load

01011000

58

RX

4

LR

Load Register

00011000

18

RR

2

LM

Load Multiple

10011000

98

RS

4

ВХН

Branch on indeXHigh

10000110

86

RS

4

MVC

MoVe Character

11010010

D2

SS

6

MVI

MoVe Immediate

10010010

92

SI

4

CLC

Compare Logical Character

11010101

D5

SS

6

CLI

Compare Logical Immediate

10010101

95

SI

4

S

Subtract

01011011

5B

RX

4

SR

Subtract Register

00011011

IB

RR

2

SP

Subtract Packed

11111011

FB

SS

6

LH

Load Half-word

01001000

48

RX

4

АН

Add Half-word

01001010

4A

RX

4

SH

Subtract Half-word

01001011

4B

RX

4

ST

STore

01010000

50

RX

4

STC

STore Character

01010010

52

RX

4

Окончательно можно получить следующую таблицу для определения смысла первых двух двоичных цифр кода:

Биты 0—1

Формат команды

Длина команды (в байтах)

00

RR

2

01

RX

4

10

RS или SI

4

11

SS

6

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

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

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

Последняя буква

Формат команды

Исключения

R

RR

I

SI

С

SS

IC, STC

Отметим, что взаимо однозначного соответствия здесь нет. Например, команда ТМ является командой формата SI, но последняя буква ее мнемонического обозначения не есть I. Правило, касающееся команд, мнемоники которых оканчиваются на С, следовало бы записать так: «Этими командами являются или команды формата SS, или команды формата RX, ориентированные на обработку символьной информации». Чаще всего, но опять же не всегда команда, мнемоника которой имеет какое-либо неуказанное окончание, принадлежит к командам формата RX. Было бы гораздо удобнее, если бы разработчики ассемблера позаботились о более разумном присвоении кодам операций мнемонических обозначений.