Форматы RR, RX и RS команд уже были рассмотрены в предыдущих главах. Этот раздел, содержащий информацию о форматах SS и SI машинных команд, завершает обсуждение основ машинного языка.
ФОРМАТ SI
Один из операндов команд формата SI хранится в памяти и адресуется полем S-типа, другой является непосредственным и указывается на месте второго операнда команд языка ассемблера. В машинных командах порядок операндов иной: адрес памяти следует занепосредственным операндом.
Вспомним, что адресное поле S-типа в команде машинного языка занимает два байта. В первом полубайте поля указывается номер регистра, использующегося в качестве базового. Оставшаяся 12-битовая часть поля содержит значение смещения. Адресное поле S-типа имеет вид
92C2D15E
где В представляет номер регистра, a D — значение смещения. В 4- байтовых командах формата SI под S-поле отводятся последние два байта. Во втором байте указывается непосредственный операнд, в первом, как всегда,— код операции. Итак, команды формата SI, которые на языке ассемблера записываются как
MOP D1 (В 1),12
(МОР — мнемоника кода операций) имеют следующий машинный формат:
Операнд 12 указывается непосредственно в машинной команде, в связи с чем получил название непосредственный операнд. Выборка его не требует обращения ни к памяти, ни к какому-либо регистру.
Команды машинного языка имеют двоичную форму. Если непосредственный операнд задан как-нибудь иначе, то ассемблер преобразует его к двоичному виду перед записью на соответствующее место в машинной команде. Пусть, например, в качестве непосредственного операнда указано С'А', что означает условную запись кода EBCDIC символа А; на место операнда 12 в машинной команде ассемблер поместит сам этот код, а именно С116 (=110000012). Аналогично, если нами используется десятичная константа, то ассемблер приводит ее к двоичному виду и помещает в соответствующее место команды. Например, команда
MVI 12(7),С'Н'
транслируется в
92С8700С
а команда
CLI 100(10),64
в 9540А064
Как мы знаем, когда в качестве операнда указывается перемещаемое выражение, ассемблер определяет соответствующие номер базового регистра и значение смещения. Предположим, что базовым является регистр 13, а значение смещения для имени ВЕЕ равно 15016. В этом случае ассемблер преобразует команду
MVI ВЕЕ + 14,С'В'
к виду
92C2D15E
Формат SS
Для определения операндов команд М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 Форматы машинных команд
Код операции, соответствующий команде 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 |
5А |
RX |
4 |
AR |
Add Register |
00011010 |
1А |
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 встречаются команды, представляющие собой исключения из приведенных выше правил, однако в обычных программах такие команды не используются.
Попытайтесь обнаружить какие-нибудь другие закономерности, связанные со значениями кодов операций. Например, все команды, последние четыре бита кодов которых представляют комбинацию 10102=А16, являются командами сложения, а отличие в кодах операций команд формата RX, использующих полуслово в качестве одного из операндов, и команд, использующих полное слово, состоит в том, что третий бит команд первого типа равен 0, а третий бит команд второго равен 1.
Кроме того, некоторая информация о командах может быть получена из их мнемонических обозначений на языке ассемблера. В частности, последняя буква мнемоники обычно определяет формат команды. В приводимой ниже таблице отмечена связь между последними буквами мнемоник некоторых команд и их форматами:
Последняя буква |
Формат команды |
Исключения |
R |
RR |
|
I |
SI |
|
С |
SS |
IC, STC |
Отметим, что взаимо однозначного соответствия здесь нет. Например, команда ТМ является командой формата SI, но последняя буква ее мнемонического обозначения не есть I. Правило, касающееся команд, мнемоники которых оканчиваются на С, следовало бы записать так: «Этими командами являются или команды формата SS, или команды формата RX, ориентированные на обработку символьной информации». Чаще всего, но опять же не всегда команда, мнемоника которой имеет какое-либо неуказанное окончание, принадлежит к командам формата RX. Было бы гораздо удобнее, если бы разработчики ассемблера позаботились о более разумном присвоении кодам операций мнемонических обозначений.