- •90 Stm Запись в память групповая.
- •98 Lm Загрузка групповая
- •92 Mvi Пересылка непосредственная
- •91 Тм Проверить по маске
- •45 Bal Переход с возвратом (rx)
- •05 Balr Переход с возвратом (rr)
- •46 Вст Переход по счетчику (rx)
- •06 Bctr Переход по счетчику (rr)
- •86 Вхн___Переход индекс больше (rs)
- •87 Bxle Переход индекс меньше или равен (rs)
- •41 La Загрузка адреса (rx)
- •93 Ts Проверить и установить (si)
- •08 Ssk Установить ключ памяти (rr).
- •09 Isk Прочитать ключ памяти (rr).
Номер варианта |
Коды команд |
Емкость оперативной памяти, Мб |
Длина слова оперативной памяти, байт |
Способ адресации микрокоманд |
1 |
1A, 6A, 18, 07 |
256 |
4 |
Принудительная адресация с двумя адресами |
2 |
5A, 2A, 58, 47 |
128 |
4 |
|
3 |
4A, 3A, 48, 05 |
512 |
4 |
|
4 |
1E, 7A, 12, 45 |
128 |
4 |
|
5 |
5E, 2E, 13, 06 |
256 |
4 |
|
6 |
1B, 6E, 10, 46 |
512 |
4 |
|
7 |
5B, 3E, 11, 86 |
128 |
4 |
|
8 |
4B, 7E, 98, 87 |
256 |
4 |
|
9 |
1F, 6B, 50, 44 |
512 |
4 |
|
10 |
5F, 2B, 40, 82 |
128 |
4 |
|
11 |
19, 7B, 90, 0A |
256 |
4 |
|
12 |
59, 3B, 28, 07 |
512 |
4 |
|
13 |
49, 2F, 68, 47 |
128 |
4 |
|
14 |
1B, 6C, 38, 05 |
256 |
4 |
|
15 |
2C, 5C, 78, 45 |
512 |
4 |
|
16 |
4C, 3C, 22, 06 |
128 |
4 |
|
17 |
1D, 6D, 46, 32 |
256 |
4 |
|
18 |
5D, 2D, 23, 86 |
512 |
4 |
|
19 |
4F, 34, 33, 87 |
128 |
4 |
|
20 |
4E, 24, 21, 44 |
256 |
4 |
|
21 |
8B, 6F, 20, 82 |
512 |
4 |
Принудительная адресация с двумя сокращенными адресами |
22 |
8A, 7F, 30, 0A |
128 |
4 |
|
23 |
8F, 3F, 31, 07 |
256 |
4 |
|
24 |
8E, 3D, 60, 47 |
512 |
4 |
|
25 |
55, 29, 70, 05 |
128 |
4 |
|
26 |
15, 69, 43, 45 |
256 |
8 |
|
27 |
95, 39, 42, 06 |
512 |
8 |
|
28 |
14, 79, 41, 46 |
128 |
8 |
|
29 |
16, 7C, 18, 86 |
256 |
8 |
|
30 |
17, 7D, 58, 87 |
512 |
8 |
|
31 |
54, 2A, 48, 44 |
128 |
8 |
|
32 |
94, 3A, 12, 82 |
256 |
8 |
|
33 |
56, 2E, 13, 0A |
512 |
8 |
|
34 |
96, 3E, 10, 07 |
128 |
8 |
|
35 |
57, 7E, 11, 47 |
256 |
8 |
|
36 |
97, 2B, 98, 05 |
512 |
8 |
|
37 |
89, 3B, 50, 45 |
128 |
8 |
|
38 |
88, 2F, 40, 06 |
256 |
8 |
|
39 |
8C, 2C, 28, 86 |
512 |
8 |
|
40 |
89, 3F, 90, 45 |
128 |
8 |
|
41 |
1D, 6A, 66, 87 |
256 |
8 |
Формирование адресов по одному условию |
42 |
1C, 7A, 38, 44 |
512 |
8 |
|
43 |
19, 6E, 78, 82 |
128 |
8 |
|
44 |
1F, 6B, 22, 0A |
256 |
8 |
|
45 |
1B, 7B, 32, 07 |
512 |
8 |
|
46 |
1E, 6F, 23, 47 |
128 |
8 |
|
47 |
1A, 7F, 33, 05 |
256 |
8 |
|
48 |
17, 6C, 21, 45 |
512 |
8 |
|
49 |
16, 7C, 20, 06 |
128 |
8 |
|
50 |
14, 7D, 30, 46 |
256 |
8 |
|
51 |
1A, 6A, 30, 46 |
512 |
4 |
|
52 |
5A, 2A, 20, 06 |
128 |
4 |
|
53 |
4A, 3A, 21, 45 |
256 |
4 |
|
54 |
1E, 7A, 33, 05 |
512 |
4 |
|
55 |
5E, 2E, 23, 47 |
128 |
4 |
|
56 |
1B, 6E, 32, 07 |
256 |
4 |
|
57 |
5B, 3E, 22, 0A |
512 |
4 |
|
58 |
4B, 7E, 78, 82 |
128 |
4 |
|
59 |
1F, 6B, 38, 44 |
256 |
4 |
|
60 |
5F, 2B, 68, 87 |
512 |
4 |
|
61 |
19, 7B, 28, 86 |
128 |
4 |
Формирование адресов по двум условиям |
62 |
59, 3B, 90, 46 |
256 |
4 |
|
63 |
49, 2F, 40, 06 |
512 |
4 |
|
64 |
1C, 6C, 50, 45 |
128 |
4 |
|
65 |
5C, 2C, 98, 05 |
256 |
4 |
|
66 |
4C, 3C, 11, 47 |
512 |
4 |
|
67 |
1D, 6D, 10, 07 |
128 |
4 |
|
68 |
5D, 2D, 13, 0A |
256 |
4 |
|
69 |
4F, 34, 12, 82 |
512 |
4 |
|
70 |
4E, 24, 48, 44 |
128 |
4 |
|
71 |
8B, 6F, 58, 87 |
256 |
4 |
|
72 |
8A, 7F, 18, 86 |
512 |
4 |
|
73 |
8F, 3F, 41, 46 |
128 |
4 |
|
74 |
8E, 3D, 42, 06 |
256 |
4 |
|
75 |
55, 29, 43, 45 |
512 |
4 |
Команды IBM-360
Машины системы IBM-360 являются вычислительными машинами с хранимой в памяти программой, т. е. команды, которые должны быть выполнены, хранятся в памяти так же, как числа и данные, над которыми выполняются действия. Команда содержит: код операции (сокращенно ОР), указывающий ту операцию, которая должна быть выполнена; затем два адреса, определяющие данные, или операнды, участвующие в этой операции. Схематически команду IBM-360 можно представить так:
-
Код операции
Адрес операнда 1
Адрес операнда 2
Операнды могут находиться как в основной памяти, так и в регистрах.
Для кода операции отводятся две шестнадцатеричные цифры (один байт). Из возможных 256 различных операций в действительности используются 143. Для задания регистра требуется одна шестнадцатеричная цифра, так как в машине имеются только шестнадцать регистров. Если оба операнда хранятся в регистрах. команда имеет следующий вид:
Байт
|
0
|
1
|
|
ОР
|
R1
|
R2
|
где R1 и R2 — адреса регистров, содержащих соответственно первый и второй операнды. Помня о том, что для записи кода операции требуются две шестнадцатеричные цифры, находим, что вся команда состоит из четырех шестнадцатеричных цифр, или занимает одно полуслово. Этот формат команд называется формат RR, или формат регистр — регистр.
Адреса ячеек основной памяти задаются сложнее. Поскольку мы должны уметь записать адрес каждого из 16 миллионов байтов, потребуется шесть шестнадцатеричных цифр; в действительности средний объем памяти равен 32 тысячам байтов, т. е. первые две шестнадцатеричные цифры адреса, как правило, нулевые. Для экономии памяти, которая достаточно дорога, желательно хранить команды в возможно более сжатом виде. В машине IBM-360 адреса основной памяти задаются в виде:
Х В DDD,
или в виде
В DDD,
где В и Х — шестнадцатеричные цифры, либо равные 0, либо указывающие один из общих регистров с номерами от 1 до 15. DDD — три шестнадцатеричные цифры, называемые смещением. Регистр Х называется индексным регистром, а его содержимое — индексом. Регистр В называется базовым регистром, а его содержимое — базовым адресом или базой. Если В = 0, то это указывает не на содержимое общего регистра 0, а на нулевое значение базового адреса. В случае, когда Х = 0, мы говорим об отсутствии индексации.
Адрес основной памяти формируется сложением смещения и базового адреса. Если Х0, то добавляется также и значение индекса. Вычисленный адрес будет исполнительным адресом, обозначаемым Е. Символически это записывается так: Е == D + (В) + (X), где буква, заключенная в круглые скобки, означает «содержимое такого-то регистра». При выполнении сложения все числа рассматриваются как двоичные целые и, если сумма занимает более трех байтов, воспринимаются только шесть ее младших шестнадцатеричных цифр.
Наиболее употребительным типом команды IBM-360 является команда типа RX, или регистр-индексируемая память, имеющая следующий формат:
Байт
|
0
|
1
|
2
|
3
|
||
ОР
|
R1
|
Х2
|
В2
|
D2
|
где R1 — адрес регистра, содержащего первый операнд, a X2, B2 и D2 задают адрес второго операнда.
Используются и другие форматы, но мы будем рассматривать их позднее.
Числа с фиксированной точкой
Команды можно классифицировать не только по типу команды, но также и в соответствии с типом данных, над которыми выполняются операции. Под числом с фиксированной точкой мы понимаем двоичное целое число, занимающее полуслово или, чаще, полное слово. Нулевой бит отводится под знак числа: 0 означает плюс, а 1 — минус. Предполагается, что десятичная точка находится справа от самой младшей цифры числа.
Отрицательные числа представляются в виде дополнений. Отметим, что наибольшее отрицательное число на единицу больше по абсолютной величине наибольшего положительного числа. Отметим также, что преобразование полуслова в полное слово достигается присвоением каждому из добавляемых шестнадцати двоичных разрядов значения, равного значению знакового бита исходного числа. Заметим также, что разрядность чисел с фиксированной точкой согласована с разрядностью общих регистров. Поэтому чрезвычайно удобно использовать общие регистры при выполнении арифметических действий над числами с фиксированной точкой.
Команды с фиксированной точкой
При описании каждой команды мы будем указывать:
1. Название команды, например (Add) сложение;
2. Код операции (ОР), например 5А;
3. Мнемоническое обозначение, например А;
4. Формат (тип) команды, например RX;
5. Описание команды.
Поскольку трудно запомнить действительные коды операций, обычно употребляют их мнемонические обозначения.
Было бы естественно знакомство с командами начать с команд ввода-вывода, так как очевидно, что первым требуемым действием должна быть запись в память некоторых команд и данных. Однако для понимания команд ввода-вывода требуется некоторое представление о том, как работают другие команды. Потому в этой главе мы предполагаем существование некоторого способа ввода информации в память и вывода ее из памяти.
Load (Загрузка) 58 L RX
58
|
R1
|
X2
|
B2
|
D2
|
(E2)–>R1
Второй операнд помещается на место первого операнда. Предыдущее содержимое регистра R1 теряется. Второй операнд не изменяется. (Напомним, что круглые скобки используются для обозначения содержимого адреса. Таким образом, (E2) означает число, хранимое по исполнительному адресу E2.)
Load (Загрузка) 18 LR RX
18
|
R1
|
R2
|
(R2)–>R1
Совпадает с предыдущей командой, отличие заключается в том, что второй операнд хранится в регистре.
Add (Сложение) 5А A RX
(R1) + (E2) –> R1
Add (Сложение) 1А AR RR
(R1) + (R2) –> R1
Второй операнд складывается с первым операндом. Сумма помещается на место первого операнда. Второй операнд не изменяется.
Subtract (Вычитание) 5В S RX
(R1) - (Е2) –> R1
Subtract (Вычитание) 1В SR RR
(R1) - (R2) -> R1
Второй операнд вычитается из первого операнда. Результат помещается на место первого операнда. Второй операнд не изменяется. Практически в машине формируется дополнение второго операнда, которое складывается с первым операндом.
Пример:
До выполнения
команды: Регистр 3 0000 0034
Регистр 5 0067 891В
Команда: SR 1В 53
После выполнения
команды: Регистр 3 без изменений
Регистр 5 0067 88Е7
Команда: SR 1B 55
После выполнения
команды: Регистр 5 0000 0000
Store (Запись в память) 50 ST RX
(R1) –> E2
Первый операнд помещается в память по адресу второго. Эта команда обратна команде Загрузка в том смысле, что при ее выполнении содержимое регистра пересылается без изменения в основную память. Для этой команды не существует формата RR.
Пример:
До выполнения
команды: Регистр 4 0000 3000
Регистр 7 FF58 F399
Память 00300С-0F 7777 8888
Команда: ST 50 7 0 400С
После выполнения
команды: Регистры 4 и 7 без изменений
Память 00300C-0F FF58 F399
Multiply (Умножение) 5С М RX
(R1 + 1) x (E2) –> R1, R1 + 1
Multiply (Умножение) 1C MR RR
(R1 + 1) x (R2) -> R1, R1 + 1
Умножение отличается от сложения и вычитания тем, что число значащих цифр результата операции равно сумме числа цифр обоих сомножителей. То есть, если перемножаются два 31-разрядных числа, произведение представляет собой 62-разрядное число. Поэтому для умножения требуется, чтобы R1 (общий регистр) имел бы четный номер. Старшие значащие разряды произведения записываются в R1, a 32 младших значащих разряда в R1 + 1. Знак произведения записывается только в R1, так как знаковый бит в регистре R1 + 1 является частью произведения.
Пример:
До выполнения
команды: Регистр 0 FFFF 1378
Регистр 1 0200 Е001
Регистр 2 0000 0086
Регистр З 0000 0034
Регистр 4 0000 3000
Память 003010-13 FFFF FFE4
Команда: М 5С 2 0 4010
После выполнения
команды: Регистр 2 FFFF FFFF
Регистр 3 FFFF F158
Регистры 0, 1 и 4 без изменений
Память без изменений
Команда: MR 1C 01
После выполнения
команды: Регистр 0 0004 0380
Регистр 1 С801 С001
Команда: MR 1C 22
После выполнения
команды: Регистр 2 0000 0000
Регистр 3 0000 1В38
Еще раз напомним, что самый левый бит в нечетном регистре не является знаковым.
Divide (Деление) 5D D RX
(R1, R1 + 1) / (E2)
Частное –> R1 + 1
Остаток –> R1
Divide (Деление) ID PR RR
(R1, R1 + 1) / (R2)
Частное –> R1 + 1
Остаток –> R1
R1 — регистр с четным номером. При делении число с удвоенной точностью, находящееся в двух смежных регистрах с четным и нечетным номерами, делится на второй операнд. Оба операнда рассматриваются как целые числа. Остаток помещается в общий регистр с четным номером, частное — в общий регистр с нечетным номером R1 + 1- Знак частного определяется по алгебраическим правилам. Остаток, если он не равен нулю, будет иметь тот же знак, что и делимое. Следует позаботиться о том, чтобы для записи частного хватило 31 разряда. Если это не будет соблюдено, операция деления не будет выполнена и будет зафиксирована ошибочная ситуация.
Пример:
До выполнения команды: Регистр 0 0375 8142
Регистр 1 1701 0271
Регистр 8 FFFF FFFF
Регистр 9 FFFF 5678
Регистр 3 0000 0034
Команда: DR 1D 01
После выполнения
команды: Регистр 0 319F 444А
Регистр 1 05DE D8C7
Команда: DR 1D 83
После выполнения
команды: Регистр 8 FFFF FCBE
Регистр 9 FFFF FFEO
Переходы
Команды, которые нужно выполнить, сами должны быть размещены где-нибудь в памяти. Обычно команды и данные хранятся в разных областях памяти, но это не обязательно. Рассмотрим программу, в которой заданы два числа с фиксированной точкой; первое по адресу 003100-03, второе по адресу 003104-07. Требуется вычислить сумму чисел и запомнить ее по адресу 003108-0В.
Программа могла бы выглядеть так:
Адрес Команда
Регистр 4 0000 3100
004000-03 L 58 2 0 4000
004004-07 А 5А 2 0 4004
004008-0B ST 50 2 0 4008
Если мы хотим возвратиться назад и повторить команды, нам нужна команда, по которой вычислительная машина начала бы выполнение команды, расположенной по адресу, не совпадающему с адресом следующей по порядку команды. Такие команды называются командами перехода. Самой важной из таких команд является команда:
Branch on Condition (Условный переход) 47 ВС RX
47
|
M1
|
X2
|
B2
|
D2
|
Следующая команда выбирается по второму адресу (E2), если условия, указываемые в поле M1, удовлетворены; в противном случае в качестве следующей команды выбирается команда, следующая по порядку адресов за командой условного перехода. В этой команде первый операнд не является адресом. Четыре его разряда определяют условие перехода. В машине проверяется признак результата и, если условие удовлетворено, осуществляется переход.
Признак результата сокращенно обозначается СС (Condition-Code) и может принимать четыре значения: 0, 1, 2 и 3. Он устанавливается в результате выполнения некоторых команд. Например, команды сложения, описанные выше, устанавливают СС = О, если сумма равна 0, СС = 1, если сумма меньше нуля, и СС = 2у если сумма больше 0. Каждый из четырех разрядов в поле M1, а именно 0, 1, 2 и 3, устанавливается равным единице, если программист хочет выполнить переход для соответствующего значения признака результата. Так, M1 = 0010 вызовет переход только в том случае, когда признак результата равняется 2; M1 = 1010 вызовет переход, если признак равен 0 или 2; M1 = 0111 вызовет переход, если признак не равен 0. Значение M1 = 0000 не вызывает перехода; при М1 = 0000 команда называется NOP (Нет Операции), a M1 = 1111 всегда вызывает переход и поэтому называется безусловным переходом.
Например:
До выполнения команды: Признак результата 2
Регистр 4 0000 3100
Регистр 5 0000 4000
Команда в 00400C-OF : ВС 47 40 5000
Результат: Перехода нет; следующая команда выбирается по адресу 004010
Команда: ВС 47 6 0 5000
Результат: Переход; следующая команда выбирается по адресу 004000.
Из тех команд, которые мы уже рассматривали, признак результата устанавливают следующие:
Сложение: A RX
AR RR
Вычитание: S RX
SR RR
Эти команды устанавливают признак результата, равным 3, если возникло переполнение, т. е. если результат операции превышает число, которое можно записать в регистр. В других случаях признак устанавливается равным 0, если результат нулевой, равным 1, если результат меньше нуля, равным 2, если результат больше нуля.
Признак результата не изменяется при выполнении команд Загрузка, Запись в память, Умножение и Деление.
Для установления признака результата можно воспользоваться следующими командами:
Compare (Сравнение) 59 С RX
(R1) – (Е2) : 0
Compare (Сравнение) 19 CR RR
(R1) – (R2) : 0
Второй операнд вычитается из первого операнда, как и в командах Вычитание, однако результат никуда не записывается. Признак результата устанавливается так же, как и в операции Вычитание. Содержимое первого регистра (R1) не изменяется.
Load and Test (Загрузка и проверка) 2 LTR RR
(R2) –> R1
Эта команда подобна команде Загрузка; однако в отличие от нее признак результата устанавливается равным 0, 1 или 2, если загружаемое число равно 0, меньше нуля или больше нуля соответственно.
Load Complement (Загрузка дополнения) 13 LCR RR
– (R2) –>R1
Дополнение второго операнда помещается на место первого операнда. Признак результата устанавливается в зависимости от того, является дополнение нулем, отрицательным или положительным числом. В том случае, когда в R2 находилось максимальное по абсолютной величине отрицательное число, признак результата устанавливается равным 3, что свидетельствует о переполнении.
Load Positive (Загрузка положительная) 10 LPR RR
| (R2) | –> R1
Абсолютное значение второго операнда помещается по адресу первого операнда. Признак результата устанавливается равным 0, 2 или 3, но не может быть установлен равным 1, так как результат этой команды, помещаемый в R1, не может быть отрицательным числом.
Load Negative (Загрузка отрицательная) 11 LNR RR
- | (R2) | -> R1
Дополнение абсолютной величины второго операнда помещается по адресу первого операнда. Признак результата устанавливается равным 0 или 1 в зависимости от того, является ли результат, помещаемый в R,, нулем или отрицательным числом.
Четыре команды LTR, LCR, LPR и LNB не имеют формата RX.
Примеры:
До выполнения
команды: Регистр 0 0000 0000
Регистр 1 0000 0001
Регистр 2 FFFP FFFE
Регистр 3 8000 0000
Регистр 4 8000 0001
Регистр 5 0000 0006
Регистр 6 0000 0006
Команда: LTR 12 22
После выполнения
команды: Регистр 2 без изменений
Признак результата 1 (результат меньше нуля)
Команда: LCR 13 62
После выполнения
команды: Регистр 6 0000 0002
Признак результата 2 (результат больше нуля)
Команда: LPR 10 60
После выполнения
команды: Регистр 6 0000 0000
Признак результата 0 (результат равен нулю)
Команда: LNR 11 64
После выполнения
команды: Регистр 6 7FFF FFFF
Признак результата 2 (результат больше нуля)
Команда: LNR 13 63
После выполнения
команды: Регистр 6 8000 0000 (дополнение)
Признак результата 3 (переполнение)
Команда: CR 19 21
После выполнения
команды: Регистры 1 и 2 без изменений
Признак результата 1 [(R1) > (R2)]
Имеется и другая форма команды условного перехода:
Branch on Condition (Условный переход) 07 BCR__RR
07
|
M1
|
R2
|
Эта команда совпадает с командой условного перехода ВС 47, но адрес перехода указывается двадцатью четырьмя младшими разрядами в общем регистре R2. Исключение: если R2 = 0, то перехода не происходит независимо от значения признака результата. Это другая форма команды NOP (Нет Операции).
Пример:
До выполнения
команды: Признак результата 1
Регистр 9 7FOO 4108
Команда: BCR 07 49
Результат: Происходит переход; следующая команда выбирается по адресу 004108
Команда: BCR 07 F0
Результат: Переход не происходит. Выполняется следующая по
порядку команда.
Branch and Link (Переход с возвратом) 45 BAL RX
Branch and Link (Переход с возвратом) 05 BALR RR
При выполнении этих команд адрес следующей по порядку команды запоминается в общем регистре R1, и переход происходит по адресу E2 (или R2 для формата RR). В формате RR, если R2 = 0, перехода не происходит. Не следует думать, что левый байт слова, запоминаемого в R1, будет содержать нули; в нем может оказаться все, что угодно. Одно из применений команды BALR состоит в занесении адреса следующей команды в регистр с последующим использованием этого регистра в качестве базового регистра.
Формат SS (память — память)
В командах, которые мы рассматривали до сих пор, действия выполнялись над словами. Форматы RR и RX для команд этого типа являются наиболее подходящими. В этом разделе мы рассмотрим команды, которые выполняются над полями переменной длины в основной памяти. Формат SS представляется следующим образом:
Байт
|
1
|
2
|
3
|
4
|
5
|
6
|
||
ОР
|
L
|
B1
|
D1
|
В2
|
D2
|
где L — длина операнда, указывающая сколько байтов должны участвовать в этой операции. L может принимать любое значение из интервала от 0 до 255 включительно, и всегда на единицу меньше числа байтов (от 1 до 256), участвующих в операции. Во всех операциях данные перемещаются из второго поля в первое.
Move (Пересылка) D2 MVC SS
Второе поле помещается по адресу первого операнда. Данные пересылаются последовательно байт за байтом, начиная с левого байта поля. Адреса в команде, как и во всех командах IBM-360, являются адресами левых байтов полей.
Примеры:
До выполнения
команды: Регистр 1 0000 4000
Память 004000-08 0001 020304050677 88
Память 004010-16 EEDD CCBBAA99 34
Команда: MVC D2 06 1000 1010
После выполнения
команды: Память 004000-08 EEDD CCBB
АА99 3477 88
Память 004010-16 без изменений
Команда: MVC D2 04 1012 1011
После выполнения
команды: Память 004010-16 EEDD DD DD
DD DD 34
Move Numerics (Пересылка цифр) Dl MVN SS
Младшие половины каждого байта (цифры) из поля второго операнда замещают младшие половины байтов в поле первого операнда. Старшие половины байтов (зоны) остаются без изменений. Эта команда подобна команде Пересылка; отличие заключается в том, что в команде Пересылка цифр пересылаются только младшие половины байтов.
Move Zones (Пересылка зон) D3 MVZ SS
Старшие половины (зоны) каждого байта из поля второго операнда замещают соответствующие части байтов в поле первого операнда. Младшая половина каждого байта (цифра) остается без изменений. Эта команда подобна команде Пересылка; отличие заключается в том, что в команде Пересылка зон перемещаются только старшие половины байтов.
Пример:
До выполнения
команды: Регистр 1 0000 4000
Память 004000-08 0001 0203
0405 0677 88
Память 004010-16 EEDD CCFB
АА99 34
Команда: MVN Dl 03 1005 1010
После выполнения
команды: Память 004000-08 0001 0203
040Е 0D7C 8В
Память 004010-16 без изменений
Команда: MVZ D3 02 1 000 1012
После выполнения
команды: Память 004000-02 СО Fl A2
Команды MVN и MVZ наиболее удобны при редактировании информации, которая считывается или выдается на карты. Зонные пробивки на картах часто помещаются над не имеющими к ним отношения числовыми полями, и эти команды используются для отделения такой информации после того, как информация считана, но еще не обработана.
Упакованные данные
Поскольку две десятичные цифры могут быть расположены в одном байте, можно сэкономить память, «упаковав» две десятичные цифры в один байт. Для облегчения такой упаковки предусмотрены две команды. Они имеют формат SS, но немного отличаются от команд того же формата, которые мы рассматривали в предыдущем разделе.
Байт
|
1
|
2
|
3
|
4
|
5
|
6
|
|||
ОР
|
L1
|
L2
|
В1
|
D1
|
B2
|
D2 |
В этих командах, вообще говоря, поля, задаваемые первым и вторым операндами, могут и не иметь одинаковую длину. Поэтому каждое поле должно иметь свой указатель длины. Для указания каждой длины используется одна шестнадцатеричная цифра, принимающая значения от 0 до 15 включительно, что соответствует полям длиной от 1 до 16 байтов.
Pack (Упаковать) F2 PACK SS
Второй операнд преобразуется из зонного формата в упакованный формат и помещается на место первого операнда. Если поле первого операнда не вмещает весь результат операции, левые (старшие) значащие цифры теряются, правые (младшие) значащие цифры остаются. Если поле первого операнда имеет большую длину, чем это требуется для хранения результата, оно Дополняется слева нулями. Приведенный ниже пример иллюстрирует упаковку шестибайтового поля в четырехбайтовое.
Зонный формат
|
|
|
|
|
|
||||||
Z1
|
N1
|
Z2 |
N2
|
Z3 |
N3
|
Z4,
|
N4
|
Z5
|
N5
|
Z6
|
N6
|
Упакованный формат:
|
|
|
|
||||
0
|
N1
|
N2
|
N3
|
N4
|
N5
|
N6
|
Z6
|
В этом примере поле с данными в упакованном формате дополнено слева нулем. Предполагается, что в четырех старших разрядах (в зоне) младшего байта поля, содержавшего данные в зонном формате, располагается знак + или –. Этот знак помещается без изменения в самую правую шестнадцатеричную позицию упакованного поля. Остальные зоны поля зонного формата во внимание не принимаются. Поля обрабатываются справа налево, и цифры упаковываются в последовательные шестнадцатеричные позиции. Число десятичных цифр в поле упакованных данных будет всегда нечетным и будет лежать в диапазоне от 1 до 31.
Unpack (Распаковать) F3 UNPK SS
Эта команда преобразует второй операнд из упакованного формата в зонный формат; результат помещается на место первого операнда. Знак упакованного поля помещается в зоне младшей цифры; всем остальным зонам присваивается шестнадцатеричное значение F – стандартное обозначение зоны цифровых символов в коде EBCDIC. Если поле первого операнда не вмещает результат операции, старшие значащие цифры теряются: если оно длиннее результата операции, свободные левые байты заполняются нулями. Если вычислительная машина переключена на работу в коде ASCII, то зонам будет присваиваться значение 5, а не F.
Пример:
Регистр 1 0000 5000
До выполнения команды: Память 005000-08 F3F4 F2F3 F0F5 F6F7 D8
Память 005009-11 090А 0В0С 437Е 0F10 11
Память 005012-14 5678 9D
Команда: PACK F2 8 8 1009 1000
После выполнения
команды: Память 005009-11 0000 0000 3423 0567 8D
Команда: UNPK F3 8 2 1009 1012
После выполнения
команды: Память 005009-11 F0F0 F0F0 F5F6 F7F8 D9
При использовании машины для решения экономических задач около 60% всех данных являются числовыми данными, так что упаковка их экономит около 30% всей памяти, выделенной для хранения данных.
Десятично-двоичные преобразования
В машине IBM-360 имеются две команды, выполняющие преобразования упакованных десятичных чисел в двоичные и обратно. Упакованное десятичное число занимает в основной памяти двойное слово (это означает, что его длина равна 8 байтам и адрес самого левого байта числа должен быть кратен 8), а двоичное число занимает общий регистр. Числа, которые должны быть преобразованы, трактуются как десятичные и двоичные целые соответственно; отрицательное двоичное число представляется при помощи дополнения. Отрицательные десятичные числа имеют в знаковой позиции либо D (для кода EBCDIC), либо В (для кода ASCII).
Convert to Binary (Преобразование в двоичную) 4F CVB RX
Десятичное число в форме упакованного двойного слова по адресу второго операнда преобразуется в двоичное целое и помещается в общий регистр R1. Если знаковая позиция равна В или D, то это означает, что десятичное число отрицательно и двоичное число представляется дополнением; если знаковая позиция равна А, С, Е или F, результатом преобразования будет положительное двоичное число.
Convert to Decimal (Преобразование в десятичную) 4Е CVD RX
Целое двоичное число, находящееся в общем регистре R1, преобразуется в упакованное десятичное число и помещается в двойное слово по адресу E2. При преобразовании отрицательных чисел в знаковую позицию помещается D (для кода EBCDIC) или В (для кода ASCII); при преобразовании положительных чисел – С или А соответственно.
Диапазон преобразуемых чисел ограничен только длиной общего регистра. Поэтому числа должны быть в интервале от +2147483647 до —2147483648. Если исходное десятичное число выходит за границы этого интервала, операция выполняется, но результат содержит только младшие цифры двоичного числа.
Пример:
До выполнения
операции: Регистр 1 0000 5100
Регистр 2 0000 0002
Регистр 3 FFFF 1287
Память 005100-07 0000 0000 0000 123D
Память 005108-0F 0000 0000 0000 123С
Память 005110-17 1334 677D 8ВА5 С200
Команда: CVB 4F 2 0 1000
После выполнения
команды: Регистр 2 FFFF FF85
Команда: CVB 4F 2 0 1008
После выполнения
команды: Регистр 2 0000 007В
Команда: CVD 4E 3 0 1008
После выполнения
команды: Память 005108-0F 0000 0000 0060 793D
Команда CVD 4E 1 0 1008
После выполнения
команды: Память 005108-0F 0000 0000 0020 736С
С помощью команд Pack и Convert легко преобразовать число, считанное в машину в зонном формате, в целое двоичное число. После обработки результат снова преобразуется в зонный формат для выдачи на печать. Рассмотрим программу сложения двух шестиразрядных чисел в зонном формате, расположенных в памяти, начиная с адресов 005200 и 005206; результат помещается по адресу 00520С в зонном формате.
Регистр 1 0000 5200
Команды: PACK F2 75 1018 1000
CVB 4F 20 1018
PACK F2 75 1018 1006
CVB 4F 30 1018
AR 1А 23
CVD 4E 20 1018
UNPK F3 57 100C 1018
В этой программе область 005218—1F мы использовали как рабочую область для временного хранения упакованных чисел. Регистры 2 и 3 использовались для размещения двоичных чисел. Легко заметить, что из семи приведенных команд только одна является арифметической; все остальные предназначены для получения чисел в желаемом формате. Это типично при решении экономических задач, где операции преобразования данных встречаются чаще, чем арифметические операции.
Десятичная арифметика
В примере, приведенном в предыдущем разделе, было немного арифметических операций, но много команд преобразования данных. Для облегчения .решения таких задач в IBM-360 имеется восемь команд десятичной арифметики. Этот набор команд является стандартным для большинства моделей и может быть включен при желании за небольшую дополнительную плату на других. Все команды имеют формат SS:
ОР
|
L1
|
L2
|
B1
|
D1
|
В2
|
D2
|
Add Decimal (Сложение десятичное) FA АР SS
Второй операнд складывается с первым, и сумма помещается на место первого операнда. Поля операндов могут перекрываться, но так, чтобы их правые (младшие) байты совпадали. Знак результата определяется по правилам алгебры, но нулевой результат всегда имеет знак плюс. Признак результата устанавливается равным 0, 1 или 2, если сумма равна нулю, меньше нуля, пли больше нуля соответственно. Если сумма слишком длинна и не укладывается в отведенное для результата поле, признак результата устанавливается равным 3, что указывает на переполнение; в этом случае теряются старшие значащие цифры.
Subtract Decimal (Вычитание десятичное) FB SP SS
Второй операнд вычитается из первого; разность помещается на место первого операнда. Признак результата устанавливается по правилам предыдущей команды. Эта команда аналогична команде сложения; отличие состоит в том, что машина при выполнении операции автоматически изменяет знак второго операнда на обратный. Совместив правые байты обоих операндов, команду SP можно использовать для очистки всего поля или его части.
Zero and Add (Сложение с очисткой) F8 ZAP SS
Второй операнд помещается на место первого операнда. Признак результата устанавливается по правилам команды сложения. Если длина поля первого операнда превышает длину поля второго операнда, слева добавляются нули; если длина поля первого операнда короче длины поля второго операнда, старшие левые цифры теряются. Если теряются ненулевые цифры, признак результата устанавливается равным 3, что указывает на переполнение. Поля первого и второго операнда могут перекрываться, но так, чтобы их правые байты совпадали. Фактически эта команда засылает нули в поле первого операнда, а затем добавляет туда второй операнд.
Compare Decimal (Сравнение десятичное) F9 СР SS
Эта команда аналогична команде вычитания; отличие заключается в том, что результат не сохраняется. Оба операнда остаются без изменений. Признак результата устанавливается равным 0, если операнды равны, равным 1, если первый операнд меньше, и равным 2, если первый операнд больше второго. Поскольку результат не запоминается, переполнения не возникает. При выполнении этой команды разницы между положительным и отрицательным нулем нет.
Multiply Decimal (Умножение десятичное) FC МР SS
Второй операнд (множитель) умножается на первый операнд (множимое). Результат помещается в поле первого операнда. Длина второго операнда не может превышать восьми байтов и должна быть всегда меньше длины первого операнда. Кроме того, в первом операнде должно быть столько нулевых старших цифр, каков размер поля второго операнда. В этих условиях переполнение результата произойти не может. Поля могут перекрываться, но так, чтобы совпадали их правые (младшие) байты. Признак результата остается без изменения. Заметим, что для расширения поля первого операнда может использоваться команда сложения с очисткой, если это необходимо.
Divide Decimal (Деление десятичное) FD DP SS
Первый операнд (делимое) делится на второй операнд (делитель). Частное помещается в поле первого операнда и его длина в байтах равна L1 – L2. Остаток помещается после частного по адресу E1 + L1 – L2, и его длина в байтах равна L2. Длина поля делителя не может быть больше восьми байтов, и во всех случаях его длина должна быть меньше длины поля делимого. Делимое, делитель, частное и остаток рассматриваются как целые числа. Знак остатка тот же, что и у делимого, даже если остаток равен нулю. Поля операндов могут перекрываться, но так, чтобы совпадали их младшие байты. Признак результата остается без изменения. Максимальный размер делимого равен 31 десятичной цифре; максимальный размер частного равен 29 десятичным цифрам.
Move with Offset (Пересылка со сдвигом) F1 МVO SS
Эта команда не относится к командам десятичной арифметики, но мы рассмотрим ее здесь, так как она используется с этими командами.
Второй операнд сдвигается на 4 разряда влево, и к нему пристраивается в качестве младших разрядов знаковая позиция первого операнда. Результат помещается в поле первого операнда. Поля обрабатываются справа налево. Если необходимо, второй операнд дополняется нулями. Если поле первого операнда не вмещает результат операции, левые (старшие) разряды второго операнда теряются. Поля первого и второго операндов могут перекрываться. С помощью этой команды легко произвести сдвиг десятичного числа на нечетное число цифр вправо.
Пример:
До выполнения команды: Регистр 1 0000 4800
Память 004800-06 1234 5678 9012 ЗС
Память 004810-16 1122 3344 5566 7D
Память 004900-04 0000 0123 4С
Память 004905-09 0034 1200 0D
Память 00490А-14 0000 0000
0000 0310
0040 OD
Память 004915-1F 0000 6826
1400 1301
3500 1D
Память 004920-2А 7777 7777
7777 7777
7777 77
Команда: SP FB 4 4 1100 1105
После выполнения
команды: Память 004900-04 0034 1323 4С
Команда: ZAP F8 A 4 1120 1100
После выполнения
команды: Память 004920-2А 0000 0000 0000 0000
0123 4С
Команда: МР FC A 4 110А 1105
После выполнения
команды: Память 00490А-14 0000 0010 5773
3648 0000 0С
Команда: DP FD A 4 1115 1105
После выполнения
команды: Память 004915-1F 2000 6272 019С
0013 0700 1D
Команда: MVO Fl 6 5 1010 1000
После выполнения
команды: Память 004810-16 0123 4567 8901 2D
Команда: MVO Fl 4 5 1012 1000
После выполнения
команды: Память 004810-16 1122 4567 8901 2D
Числа с плавающей точкой
Числа с плавающей точкой в IBM-360 представляются в следующем формате:
|
Характеристика |
Мантисса |
0 1 8 31 или 63
|
Самый левый бит отводится под знак числа: 1 означает минус, 0 – плюс. Следующие 7 битов содержат характеристику. Остальные биты слова или двойного слова содержат дробную часть, или мантиссу. Если мантисса задается 14 шестнадцатеричными цифрами, то говорят, что число с плавающей точкой представлено с удвоенной точностью; если же мантисса задается 6 шестнадцатеричными цифрами, то число представлено с обычной точностью. Число, представленное в виде ±ccffffff, имеет значение ±.ffffff x 10cc-64. Таким образом, мантисса, у которой десятичная точка фиксирована перед левым битом (позиция 8), умножается на 16 в степени характеристика минус 64. Представление в такой форме позволяет изображать числа, абсолютная величина которых больше 00100000 = .540 х 10-78 и меньше
7F FFFFFF FFFFFFFF = .724 x 1076.
Приведем несколько примеров записи чисел
Десятичное Двоичное С плавающей точкой
1 00000001 41 100000
10 0000000А 41 А00000
.1 40 199999 9999999А
.01 3F 28F5C2 8F5C28F6
0 00000000 00 000000 00000000
974 00000ЗСЕ 43 ЗСЕ000
67 345 00010711 45 107110
66371 00010343 45 103430
-67 345 FFFFF8FF С5 107110
2 147 483 647 7FFFFFFF 48 7FFFFFFF000000
.000 915 527 343 75 ЗЕ ЗС0000
–.000 915 527 343 75 BE ЗС0000
-
42 435841 ЕВ841ЕВ8
-
Заметим, что отрицательные числа с плавающей точкой представляются не в виде дополнений. Числа, представленные с обычной точностью, занимают меньше места в памяти, а числа с удвоенной точностью значительно увеличивают точность вычислений. В большинстве моделей IBM-360 арифметические операции над числами, представленными с обычной точностью, выполняются несколько быстрее операций с удвоенной точностью.
Когда значение мантиссы лежит между 1/16 и 1, мы говорим, что число нормализовано. В IBM-360 числа с плавающей точкой могут быть не нормализованы, однако результат операции над ненормализованными числами может содержать меньше значащих цифр.
Команды с плавающей точкой
Команды с плавающей точкой имеют два формата: RR или RX. В каждом из этих форматов существует два типа команд: для операций с обычной точностью и для операций с удвоенной точностью. На малых моделях IBM-360 команды с плавающей точкой включаются за дополнительную плату, на больших они являются обязательными.
В командах с плавающей точкой не используются 16 общих регистров. Они выполняются с использованием четырех регистров с плавающей точкой, каждый из которых занимает двойное слово. Эти регистры имеют номера 0, 2, 4 и 6 и вмещают числа с удвоенной точностью. 44 команды, которые рассматриваются в этом разделе, используют только эти специальные регистры, все остальные команды IBM-360 с регистрами в качестве операндов используют общие регистры.
Команды с плавающей точкой
Формат |
RR |
RX |
||||||
Точность
|
Удвоенная |
Обычная |
Удвоенная |
Обычная |
||||
Загрузка |
28 |
LDR |
38 |
LER |
68 |
LD |
78 |
LE |
*Сравнение |
29 |
CDR |
39 |
CER |
69 |
CD |
79 |
СЕ |
* Сложение N |
2А |
ADR |
ЗА |
AER |
6A |
AD |
7A |
AE |
*Вычитание N |
2В |
ВПК |
3В |
SER |
6B |
SD |
7В |
SE |
Умножение |
2С |
MDR |
ЗС |
MER |
6C |
MD |
7C |
ME |
Деление |
2D |
DDR |
3D |
DER |
6D |
DD |
7D |
DE |
*Сложение U |
2Е |
AWR |
ЗЕ |
AUR |
6E |
AW |
7E |
AU |
*Вычитание U |
2F |
SWR |
3F |
SUR |
6F |
SW |
7F |
SU |
Запись в память |
60 |
STD |
70 |
STE |
||||
*3агрузка положительная |
20 |
LPDR |
30 |
LPER |
||||
*Загрузка отрицательная |
21 |
LNDR. |
31 |
LNER |
||||
*Загрузка и проверка |
22 |
LTDR |
32 |
LTER |
||||
*Загрузка дополнения |
23 |
LCDR |
33 |
LCER |
||||
Пополам |
24 |
HDR |
34 |
HER |
В этой таблице N означает, что результат операции будет нормализован, a U, что результат не будет нормализован. Команды, помеченные символом *, устанавливают признак результата равным 0, 1 или 2 соответственно при нулевом, отрицательном или положительном результате. Эти команды во всем аналогичны обычным командам, с той разницей, что действия производятся над числами с плавающей точкой.
Команды с удвоенной точностью на каждом этапе своих вычислений оперируют с 14 шестнадцатеричными цифрами. За счет отбрасывания значащих цифр в процессе вычисления точность результата может снижаться иногда до 12 значащих цифр и ниже.
При вычислениях с обычной точностью содержимое правой половины регистров сохраняется неизменным. При выполнении операции вычисления ведутся с 8 шестнадцатеричными цифрами, к которым при необходимости справа добавляются нули. Результат выдается с 6 шестнадцатеричными цифрами.
Загрузка
Второй операнд помещается на место первого операнда.
Сравнение
Второй операнд вычитается из первого; результат вычитания не сохраняется, а используется для установки признака результата равным 0, если операнды равны; равным 1, если первый операнд больше; равным 2, если второй операнд больше. Заметим, что при сравнении чисел
45 067440
44 674400
будет установлено их равенство, так как обе записи представляют одно и то же число.
Сложение с нормализацией
Второй операнд складывается с первым и сумма помещается на место первого операнда. Признак результата устанавливается равным 0, если сумма равна нулю, равным 1, если сумма меньше 0, равным 2, если сумма больше нуля, и равным 3, если произошло переполнение.
Например, если мы сложим числа
44 674400 89654000 44
12809Е 79001000
с помощью команды АЕ, результатом будет число
44 79С49Е 89654000,
так как правая половина регистра не участвует в операции. Если же мы воспользуемся командой AD, то результатом будет число
44 79C49F 02655000.
Вычитание с нормализацией
Второй операнд вычитается из первого и результат помещается на место первого операнда.
Умножение
Два операнда перемножаются, и результат помещается на место первого операнда. Результат округляется в соответствии с тем, куда он помещается – в слово или в двойное слово.
Деление
Первый операнд делится на второй. Остаток теряется. Частное помещается на место первого операнда.
Сложение без нормализации
Вычитание без нормализации
Все арифметические команды, кроме двух последних, всегда дают результат в нормализованном виде, даже если операнды были ненормализованы. При сложении или вычитании чисел с плавающей точкой прежде всего производится выравнивание характеристик, т. е. мантисса числа с меньшей характеристикой сдвигается вправо до тех пор, пока у обоих чисел не будут одинаковые характеристики.
Например, при сложении чисел
44 674400 89654000
42 123001 11348997
мантисса второго числа должна быть сдвинута на 2 шестнадцатеричные цифры вправо и результатом сложения будет
44 674400 89654000
44 001230 01113489
44 675630 8А767489
Теперь рассмотрим такой пример
44 674400 89654000
С4 5F0000 00001000
44 084400 89653000
В результате получается ненормализованное число.
Кроме этих двух команд без нормализации, все остальные арифметические команды нормализуют результат операции, и в данном примере получилось бы
43 844008 96530000
Запись в память
Число из регистра переписывается в память.
Загрузка положительная
Абсолютная величина второго операнда помещается на место первого операнда. Признак результата устанавливается равным 0 или 2.
Загрузка отрицательная
Абсолютная величина второго операнда, взятая со знаком минус, помещается на место первого операнда. Признак результата устанавливается равным 0 или 1.
Загрузка и проверка
Совпадает с командой Загрузка, но устанавливается признак результата.
Загрузка дополнения
Второй операнд помещается на место первого операнда с противоположным знаком. Признак результата устанавливается равным 0,1 или 2.
Пополам
Это особая команда с плавающей точкой. Второй операнд делится пополам и помещается на место первого операнда. Если второй операнд имел. нулевую мантиссу, то результат будет нулевым.
Приводимая ниже программа прибавляет число, находящееся в памяти по адресу 003800, к числу, находящемуся по адресу 003804, и помещает результат по адресу 003808. Предполагается, что общий регистр 3 содержит 00 003800:
003800 44 124889
003804 СЗ F17333
003808 78 111111
Команды:
003810 LE 78 2 03 000
003814 АЕ 7А 2 03 004
003818 STE 70 2 03 008
Результат по адресу 003808: 43 33155D
Результат в регистре с плавающей точкой 2: 43 33155D
Поскольку правая половина регистра в этих командах не используется, ее содержимое не изменится.
Команды, выполняющие действия над полусловами
Обычные команды с фиксированной точкой производят операции над словами. Ради экономии памяти желательно хранить короткие константы в виде полуслов. Имеется шесть команд типа RX, выполняющих действия над полусловами.
40 STH – Запись в память полуслова
48 LH – Загрузка полуслова
49 СН – Сравнение полуслов
4А АН – Сложение полуслова
4В SH – Вычитание полуслова
4С МН – Умножение полуслова
Эти команды выполняются совершенно аналогично обычным командам ST, L, С, А и S. Полуслово расширяется до полного слова распространением самого левого бита (знакового) на 16 старших битов, а затем выполнение операции происходит так же, как если бы данные в памяти с самого начала занимали полное слово.
Команда МН несколько отличается от обычной команды М. В команде МН содержимое полуслова из памяти (второй операнд) умножается на содержимое регистра (первый операнд), и результат операции помещается на место первого операнда. В этой операции принимает участие только один регистр, в то время как при выполнении команды М участвуют два. Сохраняются только 32 младших бита полученного произведения и переполнение не регистрируется.
Рассмотрим следующий пример:
До выполнения команды:
008300-07 FFFD 0002 9999 9999
регистр 3 00 008300
Команда Содержимое регистра 4 послевыполнения команды
LH 48 4 03 000 FFFF FFFD
МН 4С 4 03 002 FFFF FFFA
ST 50 4 03 004 FFFF FFFA
SH 4B 4 03 006 0000 0000
Команды формата RS
В IBM-360 имеется несколько команд, для выполнения которых требуется три адреса. Для этих команд предусмотрен формат RS:
Байт
|
0 |
1 |
2 |
3 |
||
ОР |
R1 |
R3 |
В2 |
D2 |
Этот формат напоминает формат RХ за тем исключением, что адрес второго операнда не может индексироваться и вместо индекса задается третий операнд – содержимое одного из общих регистров.
Позже мы встретимся с несколькими командами формата RS. Здесь же давайте познакомимся только с двумя из них:
90 Stm Запись в память групповая.
Содержимое общих регистров R1, R1+1, …, R3 записывается в последовательные ячейки памяти, начиная с ячейки, заданной исполнительным адресом Е2 = (В2) + D2. Если R1 больше R3, то происходит циклическая адресация, т. в. за регистром с адресом 15 следует регистр с адресом 0, затем регистр с адресом 1 и т. д. При помощи этой команды можно записать в память содержимое любого числа регистров – от 1 до 16.
Например, команда
90 DC 0400
помещает содержимое регистра 13 в ячейки 000400–03, регистра 14 в 000404–07, регистра 15 в 000408–0В, регистра 0 в 00040С–0F, …, регистра 12 в 043C–3F.
98 Lm Загрузка групповая
Команда LM противоположна команде STM. В общие регистры R1, R1+1, …, R3 помещается содержимое ячеек памяти, начиная с ячейки, определяемой адресом второго операнда (E2).
Так, по команде
98 CD 0500
в регистр 12 помещается содержимое ячеек 000500–03 и в регистр 13 содержимое ячеек 000504–07.
Команды формата SI
Команды формата SI имеют следующую структуру:
Байты
|
0 |
1 |
2 |
3 |
|
|
ОР |
I2 |
B1 |
D1 |
В командах формата SI, как и в командах формата SS, первый операнд есть содержимое ячейки памяти. Второй операнд не является содержимым ячейки памяти или регистра, а является частью самой команды. I2 называют непосредственным адресом. Поле I2 определяет один байт данных, участвующий в операции.
Для иллюстрации рассмотрим команду
92 Mvi Пересылка непосредственная
Байт данных I2 записывается в память по адресу E1 = D1 + (B1).
Например, команда 92 FF 0 509 заменит предыдущее содержимое ячейки 000509 числом FF. С помощью этой команды в память записывается только один символ.
Другой командой формата SI является команда
91 Тм Проверить по маске
Команда ТМ сопоставляет маску I2 и байт памяти, определяемый адресом первого операнда, и устанавливает признак результата. Если каждому биту в I2, равному 1, соответствует бит, равный 0 в байте памяти, признак результата устанавливается равным 0; если каждому биту в I2, равному 1, соответствует бит, равный 1 в байте памяти, то признак результата устанавливается равным 3; во всех остальных случаях признак результата устанавливается равным 1. Если I2 = 00, то признак результата устанавливается равным 0. Содержимое байта по адресу E1 этой командой не меняется.
Рассмотрим несколько примеров:
I2 0000 1111
Байт в памяти 0001 0101
Результат СС = 1
I2 0000 1111
Байт в памяти 1100 0000
Результат СС = 0
I2 0000 0000
Байт в памяти 1111 1111
Результат СС = 0
Четыре команды ввода — вывода SIO, HIO, TIO, ТСН являются командами формата SI. Однако в этих командах поле I2 игнорируется.
Логические команды
Следующие команды принадлежат к стандартному набору команд для IBM-360:
|
RR |
RX |
SI |
SS |
|||
И |
14 NR |
54 |
N |
94 |
NI |
D4 |
NC |
Сравнение кодов |
15 CLR |
55 |
CL |
95 |
CLI |
D5 |
CLC |
ИЛИ |
16 OR |
56 |
O |
96 |
OI |
D6 |
ОС |
Исключающее ИЛИ |
17 XR |
57 |
X |
97 |
XI |
D7 |
ХС |
Форматы команд:
RR |
ОР |
R1 |
R2 |
RX |
ОР |
R1 |
X2 |
B2 |
D2 |
SI |
ОР |
I2 |
B1 |
D1 |
SS |
ОР |
L |
B1 |
D1 |
B2 |
D2 |
Заметим, что в формате SS поля обоих операндов имеют одинаковую длину.
И.
Производится поразрядное логическое умножение операндов. Результат помещается на место первого операнда. Признак результата устанавливается равным 0, если в результате получится нуль; в противном случае признак результата устанавливается равным 1.
ИЛИ.
Команда аналогична команде И, только производится поразрядное логическое сложение операндов.
Исключающее ИЛИ.
Команда аналогична команде И, только производится поразрядное сложение по модулю два.
Сравнение кодов.
Два операнда, понимаемые как двоичные величины без знака, поразрядно сравниваются. Операция сравнения прекращается, как только встречаются несовпадающие разряды.
Признак результата устанавливается равным 0, если операнды равны, равным 1, если первый операнд меньше второго, и равным 2, если первый операнд больше второго. Эта команда полезна при сравнении буквенно-цифровой информации.
Рассмотрим примеры:
До выполнения команды:
008600-03 7654 FF00
008604-07 0001 1000
008608–0B 3580 0346
Регистр: 2 00 008600
Команда: LM 98 35 2000
Результат: Регистр З 7654 FF00
Регистр 4 0001 1000
Регистр 5 3580 0346
Команда: NR 14 3 4
Результат: Регистр 3 0000 1000 СС = 1
Команда: CLR 15 45
Результат: СС = 1
Команда: I 96 06 2008
Результат: 008608 37 СС = 1
Команда: ХС D7 01200А 2000
Результат: 00860А–0В 7512
Команда: ХС D7 012000 2000
Результат: 00860А–0В 0000
Иногда полезно расписать шестнадцатеричные цифры в двоичном виде, чтобы наглядно представить действие логической команды. Заметим, что в последнем примере приведен простой способ очистки памяти.
Команды переходов
Мы уже рассматривали команду Условный переход, которая бывает двух форматов RX и RR. Теперь рассмотрим еще 6 команд переходов.