Если вы читаете эти строки, у вас почти наверняка есть под рукой подходящий компьютер. Возможно, покажется несколько странным, зачем нужно писать программу, делающую буквально то же самое, что уже умеет делать компьютер (если он исправен). Но уверены ли вы, что в точности знаете, что ваша ЭВМ в состоянии делать? Да и позволят ли вам другие пользователи достаточно долго узурпировать машину, чтобы изучить все черты ее характера? Билл Мак-Киман утверждает, что никогда не следует браться за большой проект, зависящий от структуры машины вроде компилятора или операционной системы, до тех пор, пока не создан имитатор. Но как это всегда бывает, чтобы чему-то научиться, надо научить этому кого-нибудь другого (скажем, компьютер?!).
Учебной машины модели 1 в действительности не существует. Однако, следуя традиции, она заимствует характерные черты нескольких известных машин. УМ-1 проще многих компьютеров из пластика и металла, но именно это позволяет больше внимания уделить ее структуре. Приводимое описание не претендует на полноту, характерную для руководств по ЭВМ — для такого изложения потребовалось бы дополнительное место, а его у нас нет. Чтобы восполнить пробелы, необходимо обратиться к собственным знаниям о других компьютерах. Численные значения везде, где они будут встречаться ниже, представлены в шестнадцатеричной системе (по основанию 16), как наиболее удобной для машины. Память и регистры ЭВМ УМ-1 снабжена памятью из 216 8-разрядных байтов, адресуемых от 0 до 216-1. Каждый байт памяти может содержать одну из 256 литер в коде ASCII [41], воспроизведенном на рис. 25.1. Любая группа четырех смежных байтов, адрес самого левого из которых делится нацело на четыре, является словом.
Рисунок 25.1. Набор кодировок символов ASCII. Позиции, отмеченные знаком , в УМ-1 не употребляются. Символ NUL не воспринимается; знаком NL заканчивается запись; LF вызывает переход на новую строку; CR — возврат каретки; FS — переход на новую страницу.
Слова участвуют в ряде операций, а граница самого левого байта слова называется границей слова.
Вычисления производятся с помощью 16 общих регистров размером в одно слово, перенумерованных от 0 до 15. Эти регистры располагаются в первых 64 байтах памяти, и любое обращение к байту с адресом от 0 до 63 связывается на самом деле с соответствующим байтом в блоке регистров. В некоторых командах указатель регистра рассматривается как адрес байта, вычисляемый умножением указателя на четыре. Отметим, что нумерация разрядов в слове, литере или иной конструкции будет всегда начинаться с 0 и вестись слева направо.
Имеется еще два других регистра. Счетчик адреса команды (САК) всегда указывает на адрес команды, следующей по порядку за выполняемой при обычной последовательности команд.
Рисунок 25.2. Схема основной памяти. Обратите внимание, что к регистрам можно адресоваться как к памяти.
Регистр признака результата (РПР) содержит 4 двоичных разряда. Чаще всего формирование РПР является побочным результатом выполнения команды, и его содержимое может опрашиваться командами передачи управления. Четыре разряда этого регистра — признак результата — называются (слева направо) соответственно бит переполнения, бит больше, чем, бит меньше, чем, и бит равно. В случае когда содержимое РПР задается непосредственно в команде, РПР сначала полностью обнуляется, а затем уже требуемые разряды устанавливаются равными 1. Если происходит переполнение, устанавливается лишь бит переполнения. Опрос состояния РПР не влияет на его содержимое.
О литерах выше уже упоминалось. Иногда их рассматривают как положительные 8-разрядные целые числа. Слова могут содержать 32-разрядные целые числа в дополнительном коде. Нулевой разряд в слове является разрядом знака и равен нулю в случае положительных чисел и единице — в случае отрицательных (знак является признаком дополнительного кода). Когда более короткие целые со знаком, например, обсуждаемые ниже непосредственные операнды, выступают в комбинации со словами, знаковый разряд укороченного слова размножается влево, заполняя отсутствующие биты.
Вещественные числа занимают также одно слово. Нулевой разряд определяет знак числа, разряды с 1-го по 7-й образуют порядок, а разряды с 8-го по 31-й — мантиссу. Положительные вещественные числа в знаковом разряде имеют нуль, поле порядка содержит показатель степени 16, увеличенный на 4016, а мантисса представляет собой 24-разрядную нормализованную шестнадцатеричную дробную часть числа, причем считается, что шестнадцатеричная точка стоит в мантиссе слева от старшей цифры. Нормализованность шестнадцатеричной мантиссы означает, что, по крайней мере, самая левая ее шестнадцатеричная цифра отлична от нуля, если таковая вообще имеется. Если мантисса получилась нулевой, то все число полагается равным нулю. Любой конечный результат операции действительной арифметики, который из-за ограниченности поля порядка не может быть представлен в слове, вызывает особый случай некорректности представления. Отрицательные вещественные числа представляют собой двоичное дополнение соответствующих положительных значений. В командах с вещественным непосредственным операндом применяются специальные короткие вещественные числа, образуемые отбрасыванием трех самых правых цифр мантиссы.
Встречаются команды короткие — в двухбайтовом формате — и длинные — четырехбайтовые. Все команды должны располагаться с границы четных байтов: если перед началом цикла выполнения команды в САК оказывается нечетный адрес, возникает особый случай запрещенного адреса команды. Первый байт любой команды содержит косвенный бит [42] в разряде 0 и код операции (КОП) в разрядах с 1-го по 7-й. Не все коды операций имеют смысл, и не во всех командах используется косвенный бит. Появление запрещенного КОП вызывает особый случай некорректной команды. В большинстве команд в разрядах с 8-го по 11-й указывается либо общий регистр, либо 4-разрядная литерная константа, употребляемая в качестве маски, а в разрядах с 12-го по 15-й задается второй общий регистр.
Имеются четыре вида команд: регистр-регистр (двухбайтовые команды), регистр-память, непосредственная и байтовая. Каждый тип отличается присущей ему характерной интерпретацией и способом адресации, которые мы сейчас и рассмотрим подробнее.
1. Регистр-регистр. Во всех командах типа регистр-регистр в разрядах с 12-го по 15-й указывается регистр, выступающий в качестве одного из операндов команды. Если задан косвенный бит, то операнд расположен по адресу, содержащемуся в 16—31-м разрядах регистра, номер которого указан в 12—15-м разрядах команды. В разрядах с 8-го по 11-й может быть задан или регистр, или маска. В командах CCS и MCS косвенный бит не используется.
Рисунок 25.3. Форматы представления информации,
2. Регистр-память. Обычно в командах типа регистр-память в разрядах с 8-го по 11-й указывается регистр или 4-разрядная маска, и они выступают в качестве одного из операндов. Остальная часть команды используется для формирования исполнительного адреса по следующему правилу:
— Если косвенный бит равен 0 и указатель индекс-регистра (разряды с 12-го по 15-й) равен 0, то исполнительный адрес дается полем адреса (разряды с 16-го по 31-й) команды.
— Если косвенный бит равен нулю, а указатель индекс-регистра нулю не равен, то адресная часть команды дополняется слева нулями и складывается (разумеется, в дополнительном коде) с содержимым индекс-регистра. Разряды 16—31 результата образуют исполнительный адрес. Содержимое индекс-регистра не изменяется,
— Если косвенный бит не нуль, а указатель индекс регистра — нуль, адресное поле указывает местонахождение в памяти двухбайтового косвенного поля. Содержимое косвенного поля образует исполнительный адрес. Если косвенное поле начинается не с границы четного байта, происходит особый случай некорректной косвенной адресации.
— Если косвенный бит и указатель индекс-регистра не равны нулю, косвенное поле складывается с содержимым индекс-регистра и в качестве исполнительного адреса берутся правые 16 разрядов суммы. При этом может иметь место особый случай некорректной косвенной адресации.
3. Непосредственная. Во всех непосредственных командах регистр указывается в разрядах с 8-го по 11-й, а в разрядах 12—31 содержится непосредственный операнд. В качестве непосредственного операнда может выступать 20-разрядное целое в дополнительном коде, 20-разрядный логический вектор или же действительное число в коротком формате. В командах с непосредственным операндом косвенный бит игнорируется.
4. Байтовая. Команды байтового типа выполняются аналогично командам типа регистр-память.
Описание команд
Опишем в этом разделе каждую команду. В первой строке описания приводится краткая справка, состоящая из названия команды, ее формата (RR, RS, IM, СН[43]), шестнадцатеричного кода операции, записи команды на языке ассемблера[44] и перечисления разрядов регистра признака результата, которые могут командой изменяться. Затем следует словесное описание. Содержимое РПР, устанавливаемое в результате выполнения команды, обозначает- обозначается символами О, L, G, Е[45]) или Нет (указание на то, что РПР не изменяется).
Load Register RR 0016 LR,R1 R2 GLE (Загрузка регистра)
В регистр R1 пересылается содержимое слова по исполнительному адресу. Пересылаемое значение сравнивается с нулем, и в РПР устанавливается соответствующий разряд: G, L или Е[46]). Если исполнительный адрес не попадает на границу слова, происходит особый случай неверной адресации слова.
Load RS 2016 L, R1A, R2 GLE (Загрузка)
Эта команда выполняется аналогично команде Load Register с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Load Immediate IM 4016 LI,R1 I GLE (Загрузка непосредственная)
Эта команда выполняется так же, как Load Register, с той разницей, что пересылаемая величина является непосредственным операндом I, при этом его знаковый разряд размножается на 12 битов влево. Особых случаев произойти не может.
Load Character СН 6016 LC, R1 А, R2 GE (Загрузка байта)
Регистр R1 обнуляется, и байт по исполнительному адресу записывается в его разряды 24—31. Производится сравнение пересылаемой величины с нулем, и в РПР устанавливаются разряды G или Е.
Load Negative Register RR 0116 LNR, R1 R2 OGLE (Загрузка регистра отрицательная)
В регистр R1 засылается дополнительный код слова по исполнительному адресу. Результат сравнивается с нулем и устанавливается РПР. При переполнении в РПР устанавливается лишь разряд 0. Может иметь место особый случай неверной адресации слова.
Load Negative RS 2116 LN, R1A,R2 OGLE (Загрузка отрицательная)
Эта команда выполняется так же, как Load Negative Register, но исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Load Negative Immediate IM 4116 LNI,R1 I GLE (Загрузка непосредственная отрицательная)
В регистр R1 помещается 32-разрядное двоичное дополнение 20-разрядного непосредственного операнда I, заданного в дополнительном коде. Переполнение произойти не может. Установка РПР осуществляется сравнением результата с нулем.
Load Negative Character CH 6116 LNC,R1 A,R2 LE (Загрузка байта отрицательная)
Байт по исполнительному адресу дополняется слева нулями до 32 разрядов и дополнительный код полученного слова помещается в регистр R1. Переполнения произойти не может. Для установки РПР полученная величина сравнивается с нулем.
Store Register RR 0216 STR, R1 R2 GLE (Запись регистра)
Содержимое R1 запоминается в слове по исполнительному адресу. Результат сравнивается с нулем, и устанавливается РПР. Может произойти особый случай неверной адресации слова.
Store RS 2216 ST, R1 A, R2 GLE (Запись в память)
Эта команда выполняется так же, как команда Store Register, но исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Store Character CH 6216 STC, R1 A,R2 GE (Запись в память байта)
Разряды 24—31 регистра R1 помещаются в байт по исполнительному адресу. Для установки РПР занесенная величина сравнивается с нулем.
Swap Register RR 0316 SWAPR, R1 R2 GLE (Обмен)
Содержимое регистра Rl и слова по исполнительному адресу меняются местами. Новая величина в R1 сравнивается с нулем, и устанавливается РПР. Может произойти особый случай неверной адресации слова.
Swap RS 2316 SWAP,R1 A,R2 GLE (Обмен с памятью)
Эта команда выполняется так же, как команда Swap Register, но исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Swap Character CH 6316 SWAPC, R1 А, R2 GE (Обмен с байтом)
Разряды 24—31 регистра R1 меняются местами с байтом по исполнительному адресу. РПР устанавливается при сравнении нового содержимого R1 с нулем. Разряды с 0-го по 23-й регистра R1 не изменяются,
And Register RR 0416 ANDR,R1 R2 GLE (И)
В регистр R1 помещается поразрядное логическое произведение (И) содержимого R1 и слова по исполнительному адресу. Если все разряды результата состоят из единиц, то в РПР устанавливается G, если из нулей — то Е, иначе — L, Может иметь место особый случай неверной адресации слова.
And RS 2416 AND,R1A,R2 GLE (И)
Эта команда выполняется аналогично And Register с тем отличием, что для определения исполнительного адреса используется правило адресации команд типа регистр-память.
And Immediate IM 4416 ANDI,R1 I LE (И)
В регистре R1 помещается поразрядное логическое произведение (И) содержимого R1 и непосредственно указанной величины I, дополненной слева 12 нулевыми разрядами. РПР устанавливается так же, как в команде And Register.
And Character CH 6416 ANDC,R1 A,R2 GLE (И)
В регистре R1 разряды 24—31 заменяются их логическим произведением на байт по исполнительному адресу. Разряды 0—23 регистра R1 не изменяются. РПР устанавливается так же, как в команде And Register.
Or Register RR 0516 ORR, R1 R2 GLE (ИЛИ)
Эта команда выполняется так же, как And Register, но логическое И заменяется логическим ИЛИ.
Or RS 2516 OR, R1A, R2 GLE (ИЛИ)
Эта команда выполняется так же, как And, но логическое И заменяется логическим ИЛИ.
Or Immediate LM 4516 ORI,R1 I GLE (ИЛИ)
Эта команда выполняется так же, как And Immediate, но логическое И заменяется логическим ИЛИ.
Or Character СН 6516 ORC,R1 А R2 (ИЛИ)
Эта команда выполняется так же, как And Character, но логическое И заменяется логическим ИЛИ.
Exclusive Or Register RR 0616 XORR,R1 R2 GLE (Исключающее ИЛИ)
Эта команда выполняется так же, как And Register, но логическое И заменяется исключающим ИЛИ.
Exclusive Or RS 2616 XOR,R1 A,R2 GLE (Исключающее ИЛИ)
Эта команда выполняется так же, как And, но логическое И заменяется исключающим ИЛИ.
Exclusive Or Immediate IM 4616 XORI,R1 I GLE (Исключающее ИЛИ)
Эта команда выполняется так же, как And Immediate, но логическое И заменяется исключающим ИЛИ.
Exclusive Or Character CH 6616 XORC,R1 A,R2 GLE (Исключающее ИЛИ)
Эта команда выполняется так же, как And Character, но логическое И заменяется исключающим ИЛИ.
Not Register RR 0716 NOTR, Rl R2 GLE (Отрицание)
Эта команда выполняется так же, как And Register, но логическое И заменяется логическим отрицанием второго операнда. Исходное содержимое R1 игнорируется.
Not RS 2716 NOT,R1A, R2 GLE (Отрицание)
Эта команда выполняется так же, как And, но логическое И заменяется логическим отрицанием второго операнда. Исходное содержимое R1 игнорируется.
Not Immediate IM 4716 NOTI,R1 I GLE (Отрицание)
Эта команда выполняется так же, как And Immediate, но логическое И заменяется логическим отрицанием расширенного второго операнда. Исходное содержимое R1 игнорируется.
Not Character CH 6716 NOTC,R1 A,R2 GLE (Отрицание)
Эта команда выполняется так же, как And Character, но логическое И заменяется логическим отрицанием второго операнда. Содержимое разрядов 24—31 регистра R1 игнорируется.
Branch Conditions Set Register RR 0816 BCSR,M1 R2 Нет (Условный переход по единице)
Если логическое произведение содержимого РПР и 4-разрядной маски M1 не равно нулю, содержимое САК замещается исполнительным адресом,
Branch Conditions Set RS 2816 BCS,M1 A,R2 Нет (Условный переход по единице)
Эта команда выполняется так же, как Branch Conditions Set Register, с тем отличием, что исполнительный адрес вычисляется с помощью правила адресации команд типа регистр-память.
Branch Conditions Reset Register RR 0916 BCRR,M1 R2 Нет (Условный переход по нулю)
Если логическое произведение содержимого РПР и 4-разрядной маски M1 равно нулю, содержимое САК замещается исполнительным адресом.
Branch Conditions Reset RS 2916 BCR,M1 A,R2 Нет (Условный переход по нулю)
Эта команда выполняется так же, как Branch Conditions Reset Register, с тем отличием, что исполнительный адрес вычисляется с помощью правила адресации команд типа регистр-память.
Branch and Link Register RR 0A16 BALR,R1 R2 Нет (Переход с возвратом)
Текущее содержимое САК засылается в регистр R1, а исполнительный адрес команды помещается в САК. Если признак косвенной адресации не задан, исполнительный адрес равен указателю регистра R2, умноженному на 4.
Branch and Link RS 2A16 BAL,R1 A,R2 Нет (Переход с возвратом)
Текущее содержимое САК заносится в регистр R1, а в САК засылается исполнительный адрес команды.
Save Condition Register RR 0B16 SACR,M1 R2 Нет (Сохранение состояния)
Если логическое произведение И содержимого РПР и 4-разрядного поля маски M1 отлично от нуля, по исполнительному адресу записывается слово, состоящее из всех единиц; в противном случае записывается нулевое слово. Может иметь место особый случай неверной адресации слова.
Save Condition RS 2В16 SAC, М1 А, R2 Нет (Сохранение состояния)
Эта команда выполняется так же, как команда Save Condition Register, с тем отличием, что исполнительный адрес вычисляется с помощью правила адресации команд типа регистр-память.
Save Condition Character CH 6B16 SACC,M1 A,R2 Нет (Сохранение состояния)
Если логическое произведение И содержимого РПР и 4-разрядного поля маски M1 отлично от нуля, по исполнительному адресу записывается байт, состоящий из всех единиц; в противном случае записывается нулевой байт.
Compare Register RR 0С16 CR,R1 R2 GLE (Сравнение)
В результате арифметического сравнения содержимого регистра R1 и слова по исполнительному адресу в РПР устанавливается соответствующий разряд: G, L или Е. Может иметь место особый случай неверной адресации слова.
Compare RS 2С16 С , R1 A , R2 GLE (Сравнение)
Эта команда выполняется так же, как Compare Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Compare Immediate IM 4C16 CI,R1 I GLE (Сравнение непосредственное)
Содержимое 32-разрядного регистра R1 арифметически сравнивается с полным словом, образованным из непосредственного операнда размножением его знакового разряда на 12 позиций влево. Вырабатывается соответствующий признак результата, и разряд G, L или Е устанавливается в РПР.
Compare Character CH 6C16 CC,R1 A,R2 GLE (Сравнение байтов)
Содержимое разрядов 24—31 регистра R1 сравнивается как 8-разрядное целое положительное число с байтом по исполнительному адресу. Вырабатывается соответствующий признак результата, и в РПР устанавливается разряд G, L или Е.
Compare Character String RR 0E16 CCS,M1 R2 GLE (Сравнение цепочки байтов)
Указатель регистра R2 обозначает пару регистров R2 и (R2+1)mod16 (второй регистр будем везде называть R2+1). В двойном слове, образованном парой R2 и R2+1 должно содержаться описание цепочки, а именно в разрядах 16—31 регистра R2 указывается адрес байта А1, в разрядах 0—15 регистра R2+1 — длина цепочки L и в разрядах 16—31 регистра R2 +1 — адрес байта А2. Для выполнения команды величины A1, A2 и L помещаются во внутренние регистры, РПР обнуляется и Е-бит РПР устанавливается в единицу. Затем отрабатывает следующий цикл.
1. Если L=0, то разряды 0—15 обоих регистров обнуляются, в 16—31-й разряды R2 из в внутренних регистров переносится А1, а в 16—31-й разряды R2+1 переносится А2, и выполнение команды заканчивается.
2. Байты по А1 и А2 сравниваются как 8-разрядные целые числа, и в РПР устанавливается соответствующий признак результата.
3. Если Е-бит РПР не равен единице, то 0—15-й разряды регистра R2 обнуляются, а из внутренних регистров в 16—31-й разряды R2 пересылается А1, в 0—15-й разряды R2+1 — длина L и в 16—31-й разряды R2+1 — адрес А2, и команда завершается.
4. L уменьшается на 1, адрес А1 увеличивается на величину маски M1, представляющую собой 4-разрядное целое в дополнительном коде, А2 увеличивается на 1, и цикл повторяется с первого шага.
Move Character String RR 0F16 MCS,M1 R2 Нет (Пересылка цепочки байтов)
В двойном слове R2 и (R2 +1)mod16 содержится описание цепочки в виде, описанном в команде Compare Character String. Поля L, A1 и А2 загружаются во внутренние регистры. Затем выполняется цикл.
1. Если L=0, разряды 0—15 регистров R2 и R2+1 очищаются, в 16—31-й разряды R2 помещается текущее А1, в 16—31-й разряды R2+1—значение А2, и выполнение команды завершается.
2. Байт по адресу А1 пересылается в байт по А2.
3. L уменьшается на 1, а А2 увеличивается на 1.
4. А1 увеличивается на величину маски M1, рассматриваемую как 4-разрядное целое число в дополнительном коде, и цикл возвращается к первому шагу.
Supervisor Call RS 2E16 SVC,R1 A,R2 Нет (Обращение к супервизору)
Выполнение программы прерывается, и управление передается в управляющую программу супервизора.
Execute RS 2F16 EX , R1 A, R2 Нет (Выполнить)
Выполняется команда, содержащаяся по исполнительному адресу. Результаты ее исполнения становятся таковыми для данной команды Execute. Если исполнительный адрес команды Execute нечетный, имеет место особый случай некорректности команды Execute. Глубина вложений команды Execute может быть любой. Заметим, что изменение САК происходит только в случае, когда это явным образом производится в подчиненной команде.
Load Adress RS 4E16 LA,R1 A,R2 Нет (Загрузка адреса)
Исполнительный адрес команды помещается в регистр R1
Load Multiple RS 6E16 LM,R1A,R2 Нет (Загрузка групповая)
В регистры от R1 до R2 загружается содержимое последовательных слов памяти, начиная со слова по исполнительному адресу (исполнительный адрес вычисляется в предположении, что указан нулевой индекс-регистр). Если R2 меньше, чем R1, то загружаются регистры от R1 до 15 и от 0 до R2. Может иметь место особый случай неверной адресации слова.
Store Multiple RS 6F16 STM,R1A,R2 Нет (Запись групповая)
Содержимое регистров от R1 до R2 записывается в последовательные слова памяти, начиная со слова по исполнительному адресу (исполнительный адрес вычисляется в предположении, что указан нулевой индекс-регистр). Если R2 меньше R1, то записывается содержимое регистров от R1 до 15 и от 0 до R2. Может иметь место особый случай неверной адресации слова.
Add Register RR 1016 AR,R1 R2 OGLE (Сложение)
Слово в регистре R1 складывается со словом по исполнительному адресу, и результат помещается в R1. Для установки РПР сумма сравнивается с нулем. В случае переполнения в РПР устанавливается лишь О-бит. Может иметь место особый случай неверной адресации слова.
Add RS 3016 A,R1 A,R2 OGLE (Сложение)
Эта команда выполняется так же, как Add Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Add Immediate IM 5016 AI,R1 I OGLE (Сложение непосредственное)
20-разрядный непосредственный операнд I, заданный в дополнительном коде, складывается с содержимым регистра R1, и сумма помещается в R1. Для установки РПР сумма сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Add Character CH 7016 AC, R1 A, R2 OGLE (Сложение байта)
Байт по исполнительному адресу дополняется слева 24 нулевыми разрядами и складывается с содержимым регистра R1, причем сумма помещается в R1. Для установки РПР сумма сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Subtract Register RR 1116 SR,R1 R2 OGLE (Вычитание)
Слово по исполнительному адресу (вычитаемое) вычитается из содержимого регистра R1 (уменьшаемое), и разность записывается в R1. Для установки РПР разность сравнивается с нулем. При переполнении в РПР устанавливается только О-бит. Может иметь место особый случай неверной адресации слова.
Subtract RS 3116 S,R1 A,R2 OGLE (Вычитание)
Эта команда выполняется так же, как Subtract Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Subtract Immediate IМ 5116 SI, R1 I OGLE (Вычитание непосредственное)
Из содержимого регистра R1 (уменьшаемое) вычитается 20-разрядный непосредственный операнд (вычитаемое), рассматриваемый как целое в дополнительном коде, и результат записывается в регистр R1. Для установки РПР разность сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Subtract Character CH 7116 SC,R1 A,R2 OGLE (Вычитание байта)
Из содержимого регистра R1 (уменьшаемое) вычитается байт по исполнительному адресу, дополненный слева 24 нулевыми разрядами (вычитаемое), который трактуется как положительное целое число. Результат записывается в R1. Для установки РПР разность сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Reverse Subtract Register RR 1216 RSR,R1 R2 OGLE (Вычитание обратное)
Эта команда выполняется так же, как команда Subtract Register, с тем отличием, что вычитаемое и уменьшаемое меняются ролями[47]).
Reverse Subtract RS 3216 RS,R1 A,R2 OGLE (Вычитание обратное)
Эта команда выполняется так же, как Subtract, с тем отличием, что вычитаемое и уменьшаемое меняются ролями.
Reverse Subtract Immediate IM 5216 RSI,R1 I OGLE (Вычитание непосредственное обратное)
Эта команда выполняется так же, как Subtract Immediate, с тем отличием, что вычитаемое и уменьшаемое меняются ролями.
Reverse Subtract Character CH 7216 RSC,R1 A,R2 OGLE (Вычитание байта обратное)
Эта команда выполняется так же, как Subtract Character, с тем отличием, что вычитаемое и уменьшаемое меняются ролями.
Multiply Register RR 1316 MR,R1 R2 OGLE (Умножение)
Перемножаются содержимое регистра R1 и слова по исполнительному адресу; младшие 32 разряда произведения записываются в регистр R1. Для установки РПР результат в R1 сравнивается с нулем. При переполнении в РПР устанавливается только О-бит. Может иметь место особый случай неверной адресации слова.
Multiply RS 3316 M,R1 A,R2 OGLE (Умножение)
Эта команда выполняется так же, как Multiply Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Multiply Immediate IM 5316 MI,R1 I OGLE (Умножение непосредственное)
В регистр RI записываются младшие 32 разряда произведения содержимого регистра R1 на 20-разрядный непосредственный операнд I. Для установки РПР произведение в R1 сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Multiply Character СН 7316 МС, R1 А, R2 OGLE (Умножение байта)
В регистр R1 записываются младшие 32 разряда произведения содержимого регистра R1 на 8-разрядное положительное целое число, расположенное в байте по исполнительному адресу. Для установки РПР величина в R1 сравнивается с нулем. При переполнении в РПР устанавливается только О-бит.
Divide Register RR 1416 DR,R1 R2 OGLE (Деление)
Содержимое регистра R1 (делимое) делится на слово по исполнительному адресу (делитель), и частное записывается в регистр R1. Деление определено таким образом, что остаток получается неотрицательным. Для установки РПР частное сравнивается с нулем. При переполнении в РПР устанавливается только О-бит. Может иметь место особый случай неверной адресации слова. Если делитель равен нулю, то про происходит особый случай деления на нуль и регистр R1 не меняется.
Divide RS 3416 D, R1 A, R2 OGLE (Деление)
Эта команда выполняется так же, как Divide Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Divide Immediate IM 5416 DI, R1 I OGLE (Деление непосредственное)
В регистр R1 записывается частное от деления содержимого R1 (делимое) на значение 20-разрядного непосредственного операнда I в дополнительном коде. Операция определяется таким образом, чтобы остаток от деления был неотрицательным. Для установки РПР частное сравнивается с нулем. При переполнении в РПР устанавливается только О-бит. Если делитель равен нулю, то происходит особый случай деления на нуль и регистр R1 не изменяется.
Divide Character CH 7416 DC, R1 A, R2 GLE (Деление на байт)
В регистр R1 записывается частное от деления содержимого регистра R1 (делимое) на положительное 8-разрядное целое число в байте по исполнительному адресу (делитель). Частное определяется таким образом, чтобы остаток от деления был неотрицательным. Для установки РПР частное сравнивается с нулем. Если делитель равен нулю, то происходит особый случай деления на нуль и регистр R1 не изменяется. Переполнение невозможно.
Reverse Divide Register RR 1516 RDR,R1 R2 OGLE (Деление обратное)
Эта команда выполняется так же, как Divide Register, с тем отличием, что делимое и делитель меняются ролями.
Reverse Divide RS 3516 RD, Rl A,R2 OGLE (Деление обратное)
Эта команда выполняется так же, как Divide, с тем отличием, что делимое и делитель меняются ролями.
Reverse Divide Immediate IM 5516 RDI,R1 I GLE (Деление непосредственное обратное)
Эта команда выполняется так же, как Divide Immediate, с тем отличием; что делимое и делитель меняются ролями.
Reverse Divide Character CH 7516 RDC,R1 A,R2 GLE (Деление на байт обратное)
Эта команда выполняется так же, как Divide Character, с тем отличием, что делимое и делитель меняются ролями.
Remainder Register RR 1616 REMR,R1 R2 GE (Остаток от деления)
В регистр R1 записывается неотрицательный остаток от деления содержимого регистра R1 (делимое) на слово по исполнительному адресу (делитель). Для установки РПР остаток сравнивается с нулем. Может иметь место особый случай неверной адресации слова. Если делитель равен нулю, происходит особый случай деления на нуль и регистр R1 не изменяется.
Remainder RS 3616 REM, R1 А, R2 GE (Остаток от деления)
Эта команда выполняется так же, как Remainder Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Remainder Immediate IM 5616 REMI, R1 I GE (Остаток от деления непосредственного)
В регистр R1 записывается неотрицательный остаток от деления содержимого R1 (делимое) на значение 20-разрядного непосредственного операнда I в дополнительном коде (делитель). Для установки РПР остаток сравнивается с нулем. Если делитель равен нулю, происходит особый случай деления на нуль и регистр R1 не изменяется.
Remainder Character CH 7616 REMC, R1 A, R2 GE (Остаток от деления на байт)
В регистр R1 записывается неотрицательный остаток от деления содержимого регистра R1 (делимое) на положительное 8-разрядное целое число (делитель) в байте по исполнительному адресу. Для установки РПР остаток сравнивается с нулем. Если делитель равен нулю, происходит особый случай деления на нуль и регистр R1 не изменяется.
Reverse Remainder Register RR 1716 RREMR,R1 R2 GE (Остаток от деления обратного)
Эта команда выполняется так же, как Remainder Register, с тем отличием, что делимое и делитель меняются ролями.
Reverse Remainder RS 3716 RREM,R1 A,R2 GE (Остаток от деления обратного)
Эта команда выполняется так же, как Remainder, с тем отличием, что делимое и делитель меняются ролями.
Reverse Remainder Immediate IM 5716 RREMI,R1 I GE (Остаток от деления непосредственного обратного)
Эта команда выполняется так же, как Remainder Immediate, с тем отличием, что делимое и делитель меняются ролями.
Reverse Remainder Character CH 7716 RREMC, R1 A, R2 GE (Остаток от деления на байт обратного)
Эта команда выполняется так же, как Remainder Character, с тем отличием, что делимое и делитель меняются ролями.
Real Add Register RR 1816 FAR,R1 R2 GLE (Сложение вещественное)
Величина в регистре R1 складывается с вещественным числом по исполнительному адресу, и результат записывается в регистр R1. Для установки РПР сумма сравнивается с нулем. Могут иметь место особые случаи и неверной адресации слова, и некорректности вещественного представления[48]).
Real Add RS 3816 FA,R1 A,R2 GLE (Сложение вещественное)
Эта команда выполняется так же, как Rl Add Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Real Add Immediate IM 5816 FAI,R1 I GLE (Сложение вещественное непосредственное)
В регистр R1 записывается сумма величины из регистра R1 и непосредственного операнда I в коротком вещественном формате. Может иметь место особый случай некорректности вещественного представления.
Real Subtract Register RR 1916 FSR,R1 R2 GLE (Вычитание вещественное)
Из содержимого регистра Rl (уменьшаемое) вычитается вещественное число по исполнительному адресу (вычитаемое), и результат записывается в регистр R1. Для установки РПР разность сравнивается с нулем. Могут иметь место особые случаи неверной адресации слова и некорректности вещественного представления.
Real Subtract RS 3916 FS,R1A,R2 GLE (Вычитание вещественное)
Эта команда такая же, как Real Subtract Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Real Subtract Immediate IM 5916 FSI,R1 I GLE (Вычитание вещественное непосредственное)
Из величины в регистре R1 (уменьшаемое) вычитается непосредственный короткий вещественный операнд I (вычитаемое), и результат записывается в регистр R1. Для установки РПР разность сравнивается с нулем. Может иметь место особый случай некорректности вещественного представления.
Reverse Real Subtract Register RR 1A16 RFSR, R1 R2 GLE (Вычитание вещественное обратное)
Эта команда такая же, как Real Subtract Register, с тем отличием, что уменьшаемое и вычитаемое меняются ролями.
Reverse Real Subtract RS ЗА16 RFS,R1 A,R2 GLE (Вычитание вещественное обратное)
Эта команда такая же, как Real Subtract, с тем отличием, что уменьшаемое и вычитаемое меняются ролями.
Reverse Real Subtract Immediate IM 5A16 RFSI,R1 I GLE (Вычитание вещественное непосредственное обратное)
Эта команда такая же, как Real Subtract Immediate, с тем отличием, что уменьшаемое и вычитаемое меняются ролями.
Real Multiply Register RR 1B16 FMR,R1 R2 GLE (Умножение вещественное)
Величина в регистре R1 умножается на вещественное число по исполнительному адресу, и результат записывается в регистр R1. Для установки РПР произведение сравнивается с нулем. Могут иметь место особые случаи как неверной адресации слова, так и некорректности вещественного представления.
Real Multiply RS 3B16 FM, R1 A , R2 GLE (Умножение вещественное)
Эта команда такая же, как Real Multiply Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Real Multiply Immediate IM 5B16 FMI,R1 I GLE (Умножение вещественное непосредственное)
Величина в регистре R1 умножается на короткий вещественный непосредственный операнд I, и результат записывается в регистр R1. Для установки РПР произведение сравнивается с нулем. Может иметь место особый случай некорректности вещественного представления.
Real Divide Register RR 1С16 FDR,R1 R2 GLE (Деление вещественное)
Величина в регистре R1 (делимое) делится на вещественное число по исполнительному адресу (делитель), и результат записывается в регистр R1. Для установки РПР частное сравнивается с нулем. Могут иметь место особые случаи неверной адресации слова, некорректности вещественного представления и деления на нуль.
Real Divide RS 3C16 FD, R1 A, R2 GLE (Деление вещественное)
Эта команда такая же, как Real Divide Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Real Divide Immediate IM 5C16 FDI,R1 I GLE (Деление вещественное непосредственное)
Величина в регистре R1 (делимое) делится на короткий вещественный непосредственный операнд I (делитель), и результат записывается в регистр R1. Для установки РПР частное сравнивается с нулем. Могут иметь место особые случаи некорректности вещественного представления и деления на нуль.
Reverse Real Divide Register RR 1D16RFDR, R1 R2 GLE (Деление вещественное обратное)
Эта команда такая же, как Real Divide Register с тем отличием, что делимое и делитель меняются ролями.
Reverse Real Divide RS 3D16 RFD,R1 A,R2 GLE (Деление вещественное непосредственное обратное)
Эта команда такая же, как Real Divide, с тем отличием, что делимое и делитель меняются ролями.
Reverse Real Divide Immediate IM 5D16 RFDI,R1 I GLE (Деление вещественное непосредственное обратное)
Эта команда такая же, как Real Divide Immediate, с тем отличием, что делимое и делитель меняются ролями.
Convert To Real Register RR 1Е16 FLOATR,R1 R2 GLE (Преобразование в вещественное)
32-разрядное целое в дополнительном коде по исполнительному адресу преобразуется в формат вещественного числа и записывается в регистр R1. Для установки РПР результат преобразования сравнивается с нулем. Может иметь место особый случай неверной адресации слова.
Convert To Real RS 3E16 FLOAT,R1 A,R2 GLE (Преобразование в вещественное)
Эта команда такая же, как Convert To Real Register, с тем отличием, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Convert To Real Immediate IM 5E16 FLOATI, R1 I GLE (Преобразование в вещественное непосредственное)
Непосредственный операнд, рассматриваемый как 20-разрядное целое в дополнительном коде, преобразуется в формат вещественного числа и записывается в регистр R1. Для установки РПР результат сравнивается с нулем.
Convert To Integer Register RR 1F16 FIXR,R1 R2 OGLE (Преобразование в целое)
Целая часть вещественного числа в слове по исполнительному адресу преобразуется в 32-разрядное целое в дополнительном коде и записывается в регистр R1. При переполнении результат обнуляется и в РПР устанавливается О-бит. Для установки в РПР других разрядов результат сравнивается с нулем. Может иметь место особый случай неверной адресации слова [49].
Convert To Integer RS 3F16 FIX, R1 A, R2 OGLE (Преобразование в целое)
Эта команда такая же, как Convert To Integer Register, если не считать того, что исполнительный адрес вычисляется по правилу адресации команд типа регистр-память.
Convert To Integer Immediate IM 5F16 FIXI,R1 I OGLE (Преобразование в целое непосредственное)
Короткий вещественный непосредственный операнд I преобразуется в 32-разрядное целое в дополнительном коде и записывается в регистр R1. При переполнении результат обнуляется и в РПР устанавливается О-бит. Для установки в РПР других разрядов результат сравнивается с нулем.
Real Floor RS 7816 FLOOR, R1 A, R2 GLE (Вещественное округление с недостатком)
В регистр R1 записывается в вещественном формате ближайшее целое, не превосходящее вещественного числа по исполнительному адресу. Для установки РПР результат сравнивается с нулем. Может иметь место особый случай неверной адресации слова.
Real Ceiling RS 7916 CEIL,R1 A,R2 GLE (Вещественное округление с избытком)
В регистр R1 записывается в вещественном формате ближайшее целое, не меньшее вещественного числа по исполнительному адресу. Для установки РПР результат сравнивается с нулем. Может иметь место особый случай неверной адресации слова.
Minimum RS 7A16 MIN, R1 A, R2 LE (Минимум)
В регистр R1 записывается минимальная из величин, содержащихся в регистре R1 и слове по исполнительному адресу. Установка РПР производится в результате сравнения исходного и конечного содержимого R1. Может иметь место особый случай неверной адресации слова.
Maximum RS 7В16 МАХ, R1 А, R2 GE (Максимум)
Эта команда такая же, как Minimum, с тем отличием, что минимум заменяется на максимум.
Shift Logical RS 7C16 SHIFTL,R1 A,R2 OGLE (Сдвиг логический)
Исполнительный адрес рассматривается как 16-разрядное число в дополнительном коде, называемое счетчиком сдвига. Содержимое регистра R1 сдвигается на число разрядов, равное значению счетчика сдвига, сдвиг происходит влево при положительном значении счетчика и вправо — при отрицательном. Разряды, выталкиваемые за границы регистра, теряются. При потере хотя бы одного единичного разряда в РПР устанавливается О-бит. Для установки в РПР остальных разрядов результат сравнивается с нулем[50]).
Shift Circular RS 7D16 SHIFTC,R1 A,R2 GLE (Сдвиг циклический)
Эта команда работает так же, как Shift Logical, с тем отличием, что разряды, выталкиваемые за пределы регистра, занимают освобождающиеся позиции с другой стороны. Переполнение произойти не может.
Shift Arithmetic RS 7E16 SHIFTA,R1 A,R2 OGLE (Сдвиг арифметический)
Эта команда работает аналогично команде Shift Logical при сдвигах влево, а при сдвигах вправо освободившимся разрядам присваивается значение нулевого разряда. Если при сдвиге влево бит, выдвинутый в знаковый разряд, отличается от последнего, происходит переполнение.
Shift Real RS 7F16 SHIFTR,R1 A,R2 GLE (Сдвиг вещественный)
Исполнительный адрес рассматривается как 16-разрядный счетчик сдвига в дополнительном коде. Мантисса абсолютного значения вещественного числа в регистре R1 сдвигается влево или вправо на 4 разряда, освободившиеся позиции заполняются нулями. Если в итоге мантисса равна нулю, значит, таков результат. В противном случае из порядка вычитается значение счетчика сдвига и полученная величина записывается с исходным знаком в регистр R1. Переполнение произойти не может, но возможен особый случай некорректности вещественного представления. Для установки РПР результат сравнивается с нулем.
В современных компьютерах организация ввода/вывода по крайней мере столь же сложна, как центральный процессор. Чтобы не увеличивать в два раза объем задачи, предположим, что супервизор управляет прохождением каждой задачи пользователя.
Таблица 25.1 Сводка кодов операций
Обращения к супервизору могут осуществляться как непосредственно при помощи команды вызова супервизора Supervisor Call, так и косвенным образом — при возникновении особых случаев. Различные поля команды Supervisor Call используется для задания требуемых действий и передачи параметров. Далее представлен минимальный набор действий супервизора в зависимости от содержимого указателя регистра R1.
R1 = 0 — Завершить выполнение программы и произвести после нее «чистку мусора»
R1 = 1 — Прочитать из входного потока целое число и записать его по исполнительному адресу команды SVC (адрес должен указывать на слово).
R1 = 2 — Прочитать вещественное число и записать его по исполнительному адресу.
R1 = 3 —Прочитать литеру и записать по исполнительному адресу.
R1 = 4 — Перейти во входном потоке к новой записи.
R1 = 5 — Слово по исполнительному адресу записать в выходной поток в виде целого числа.
R1 = 6 — Слово по исполнительному адресу записать в выходной поток в виде вещественного числа.
R1 = 7 —Байт по исполнительному адресу записать в выходной поток в виде литеры.
R1 = 8 —Записать в выходной поток признак конца записи.
R1 = 9 и R2 = 0 —Закончить трассировку выполнения команд.
R1 = 9 и R2 = 1 — Начать трассировку выполнения команд. Печатать текущую информацию о каждой выполняемой команде.
R1 = А — Исполнительный адрес команды SVC должен быть адресом слова. Правое полуслово указывает адрес начала, а левое — адрес конца участка памяти для дампа. Программа дампа должна выдавать содержимое памяти в указанных пределах как в шестнадцатеричном, так и в текстовом формате. Возможно, окажется полезным выводить также мнемонику команд. Идущие подряд одинаковые строки программа дампа должна распознавать и печатать одну из них.
R1 = F — Данный вызов супервизора никогда не будет предназначаться для системного применения и может быть использован в имитаторе для любых целей.
Предполагается, что целые и вещественные числа во входном и выходном потоках заканчиваются пробелами.
Особые случаи имеют место, когда в процессе выполнения команд возникают ошибки. При этом выполнение программы прерывается и супервизор извещается о причине прерывания и адресе команды, вызвавшей прерывание. Приведем вкратце перечень особых случаев.
Запрещенный адрес команды — на начало цикла выполнения команды адрес в САК — нечетный.
Некорректная команда — команда с данным кодом операции отсутствует.
Некорректная косвенная адресация — косвенный адрес — нечетный.
Неверная адресация слова — адрес слова, указанный в операнде команды, не делится на четыре.
Некорректность вещественного представления — результат некоторой операции, определяющей вещественное значение, не может быть представлен в формате нормализованного вещественного числа.
Некорректность команды Execute — исполнительный адрес команды Execute — нечетный.
Деление на нуль — в операциях деления или нахождения остатка делитель равен нулю.
Зацикливание кода операции — четырехбайтовая команда начинается с FFFE.
Реакция супервизора на особый случай оставляется на усмотрение исполнителя, она должна лишь включать в себя сообщение пользователю о происшедшем событии.
Файл абсолютной загрузки описывает содержимое памяти УМ-1 перед выполнением программы. Обычно такие файлы получаются с помощью загрузчика УМ из перемещаемого языка загрузки, и в практически работающих системах такие файлы для экономии места в памяти, как правило, представляются в некотором двоичном формате. В нашем случае мы опишем формат, который можно отперфорировать, что облегчает процесс отладки. Каждая из записей физического файла состоит из 80 внешних литер, при этом допустимыми являются цифры, буквы А, В, С, D, E, F, N и пробел. Чаще всего эти внешние литеры будут объединяться в группы, образуя шестнадцатеричные числа. Заметим, что для образования одного двухразрядного шестнадцатеричного числа требуются две внешние литеры, и это в свою очередь как раз обеспечивает заполнение позиции одной внутренней литеры (байта) УМ-1). [51]
Любая запись, кроме последней, имеет стандартный формат. Литера 1 представляет собой контрольную сумму всех остальных шестнадцатеричных цифр, получаемую путем их суммирования без учета переносимых знаков. Литеры со 2-й по 4-ю являются шестнадцатеричным порядковым номером, причем первая запись имеет номер 000. О выходе за пределы номеров записей следует сигнализировать как о нефатальной ошибке. Вслед за этой шапкой в записи располагаются триплеты: счетчик — адрес — данные. Поле счетчика содержит одну цифру и указывает, сколько байтов в памяти должна занять последующая информация. Поле адреса, состоящее из четырех цифр, дает шестнадцатеричный адрес начала информации в памяти УМ-1. И, наконец, поле данных содержит по две цифры на каждую подлежащую загрузке литеру, и любая такая пара цифр считывается как целое шестнадцатеричное число, определяя, таким образом, восемь битов информации для записи в память. В одной записи может быть несколько таких триплетов, однако ни один из них не должен выходить за границы записи. Первый же пробел, появившийся в поле адреса, ограничивает полезную информацию в записи, и оставшуюся часть записи можно, если угодно, использовать для комментариев. Последняя запись содержит на месте символов 1—3 литеры END, а символы с 4-го по 7-й определяют четырехзначный шестнадцатеричный адрес начала программы. Например, запись
Е10241А2301020304207FF1ВЕС
имеет контрольную сумму Е, порядковый номер 102 и помещает (достаточно бессмысленно) четыре литеры данных 01020304 с 1А23 адреса памяти, а две литеры 1ВЕС с адреса 07FF. Обратите внимание, что потребовалось восемь шестнадцатеричных цифр, чтобы задать четыре литеры во внутренней памяти.
Тема. Напишите имитатор ЭВМ УМ-1. На вход имитатора должны поступать файл абсолютной загрузки и входной поток эмулируемой программы. Основное, что необходимо выдать, — это выходной поток программы. В виде приложения к имитатору напишите, по крайней мере, две программы для УМ-1, призванные проверить правильность эмуляции. Разумеется, эти программы надо будет вручную скомпоновать в формате файла абсолютной загрузки.
Кроме записи результата в память имитатор должен уметь выполнять трассировку и дамп эмулируемой программы. Трассировка должна продемонстрировать прокручиваемую команду, вычисление исполнительного адреса, а также операнды и результаты как в их естественном, так и в шестнадцатеричном формате. Дамп должен включать в себя печать содержимого памяти (возможно, под управлением вспомогательных средств) в шестнадцатеричном виде, в мнемонических обозначениях команд, а также в форматах целом, вещественном и текстовом. Повторяющиеся группы данных должны печататься только один раз с указанием числа повторений. Управление трассировкой и дампом может выходить прямо на имитатор, возможно через пульт управления, или же может приводиться в действие путем обращений к супервизору в ходе выполнения программы.
Указания исполнителю. Имитаторы компьютеров бывают, как правило, простыми, если они основаны на заурядном цикле: ячейка — декодирование — выполнение. Как только выделен код операции, так определен один из очевидных 128 путей ветвления. Эти 128 независимых программ моделирования команд могут использовать целый ряд общих подпрограмм, выполняющих частные задачи, а именно подпрограмм вычисления исполнительного адреса, установки САК, проверки особых случаев, итогового состояния памяти и тому подобные. Четкая разбивка на подпрограммы поможет продемонстрировать правильность работы. В то же время важна эффективность выполнения командного цикла — в противном случае расход времени может оказаться недопустимо большим. Необходимо найти разумный компромисс. Для остальных частей имитатора не нужна столь же высокая эффективность, поскольку им предстоит выполняться во много раз реже.
Некоторые группы, выполнявшие в прошлом это задание, сообщали, что время, потраченное на конструирование простого ассемблера для получения тестовых вариантов, не прошло без пользы. Если в числе порученных вам работ окажется также и разработка загрузчика УМ, тщательно сконструированный ассемблер позволит применить его, ко всему прочему, и для проверки загрузчика.
Инструментовка. Перед нами вновь программа, в которой ясность и эффективность противоречат друг другу. Рассмотрите возможность применения любого языка достаточно высокого уровня, в котором наиболее важные программы можно после отладки эффективно переписать на языке ассемблера. Поскольку обычная связь между подпрограммами может оказаться дорогостоящей, эта задача представляет удобный случай поэкспериментировать с языками, позволяющими прямо вставлять небольшие заплатки на языке ассемблера. В какой-то степени среди прочих языков этими качествами обладают Фортран, Алгол и XPL.
Длительность исполнения. Одному исполнителю на шесть недель, двоим — на три недели. Если работа делается более чем одним исполнителем, каждый отчитывается за одну программу для УМ-1.
Развитие темы. Самой очевидное дополнение к задаче состоит в получении временных характеристик (профиля) эмулируемой программы. Как часто работает каждая команда? Как часто используется каждая внутренняя подпрограмма? Какова картина обращений к памяти? К регистрам? И так далее, сколько пожелаете. Эту информацию бывает чрезвычайно трудно получить в реальном компьютере, но она очень помогает при анализе сложных ситуаций.
Белл, Ньюэлл (Bell С. G., Newell A.). Computer Structures: Readings and Examples. McGraw-Hill, New York, NY, 1971.
Белл и Ньюэлл обсуждают общие принципы машинной архитектуры и приводят около 30 примеров. Значительное место уделяется разработке обозначений для описания машины. Многие примеры почерпнуты из существенно отредактированных документов проектов подлинных машин.
IBM Corporation. IBM System/360 Principles of Operation. IBM System Reference Library, GA22 6821-8, November 1970.
Xerox Data Systems. Xerox Sigma 7 Computer Reference Manual. Order # 90 09503, 1971.
УМ-1 весьма похожа как на Sigma 7, так и на IBM 360. Возможно, что сравнение этих машин с УМ-1 будет в чем-то полезно. С не меньшим успехом годятся другие выпуски указанных руководств.
Кнут Д. Искусство программирования для ЭВМ. Т. 1. Основные алгоритмы. — М.: Мир, 1976, с. 159.
Кнут описывает гипотетическую машину MIX. В п. 1.4.3.1 дается материал о MIАХ-имитаторе.