51
Трехадресные, одноадресные и… безадресные машины
Когда читатели «Кванта» знакомились с работой управления устройства*) вычислительной машины, рассматривались ЭВМ с таким форматом команды, как на рисунке 1. Адресная часть команды на этом рисунке разделена на три поля с адресами операндов (величин, участвующих в операции).
Код операции 1-e адресное поле 2-e адресное поле 3-e адресное поле
Рис. 1.
В первом адресном поле находится адрес первого операда выполняемой операции, во втором — адрес второго операда. Третье адресное поле — это адрес результат. Все три адрес имеют одинаковую длину. Такой формат команды не долженая до наших дней трехадресная машина БЭСМ-2. Например, команда 01 0257 1023 0016 в БЭСМ-2 означает сложение (код операции — 01) величины, хранящейся в машинном слове по адресу 0257, с величины, находящаяся в машинном слове по адресу 1023, и размещение результат в машинном слове с адресом 0016.
Когда в адресном поле команды записьается адрес машинного слова, находящщегося в памяти (как в случае БЭСМ-2),лина адресного поля определяется объемом оперативной памяти. Например, для того чтобы 4К = 2¹² = 4096*) машинных слов из оперативной памяти могли иметь различuousся адреса,лина одного адрес должно стать не менее 12 двойных разрядов.
Иной вид имеет команда одноадресной машины (рис. 2).
Код операции Адресное поле
Рис. 2.
В адресном поле такой команды можно указать только один адрес. А как же в таком случае задать адрес второго операда? А куда послать результат? Чтобы ответить на эти вопросы, надо знать, что в однозадресной машине есть особый регистр, равный по длине машинному слову. Этот регистр называется сумматором. Он принимает участие в выполнения практических tasks of the command machine. Например, в кодах еще одного «дедушки» совершенных ЭВМ — однозадресной машины «Урал-2» — сложение двух чисел, хранящихся в памяти по адресу 0257 и 1023 с засылкой результата по адресу 0016 выполняется таким темя командами:
02 0257 (посылка в сумматор числа из машинного слова с адресом 0257)
01 1023 (сложение содержимого сумматора с числом, хранящимся в машинном слове по адресу 1023; результат получается в сумматоре)
16 0016 (пересылка числа из сумматора в машинном слове по адресу 0016)
Не следует думать, что программа одной и той же задачи в однозадресной машине всегда вторе длинее, чем в трехадресной. В большинстве
*) Здесть К обозначает не ключат, равный 1024 байтам, а просто число 1024 = 2¹⁰.
52
пraktических случая (особенно когда результат операции неосредственно используется в следующей операции) уделение программы оказывает необольшим.
Вот пример. В кодах трехадресной машины программы, вычислочная выражение , записывается так:
03 А А В (умножение )
01 А В В (сложение )
02 В С В (вычитание )
где А — это адрес числа , по адресу С хранится единица, В — адрес машинного слова, используемого в качестве промежуточного. В однадресной машине та же программа выглідит так:
02 А (посылка числа в сумматор )
06 А (умножение ; результат в сумматоре)
01 А (сложение ; результат в сумматоре)
03 С (вычитание ; результат в сумматоре).
Итак, программа увеличилась всего на одну команду (обратили ли вы внимание на то, что в последней программе не попадались промежуточные машинные слова?). А вот экономия оборудования в однадресной машине значительная: ведь адресная часть каждой команды становится второе короче.
Вряд ли после этого читатель найдет удивительной двухадресную машину (такими были машины «Минск»). Зато получадается машина может показаться на первый входдействия второе короче. Но представьте себе, что ЭВМ располагает двумя типами оперативной памяти: одна — обычная, большая, в которой для обозначения места машинного слова нужен «длинный» адрес; другая — сверхбыстрыйствующая, обладающая небольшим числом регистров, для однозначного указания которых достаточно совсем «короткого» адрес. Это и есть получадает ЭВМ.
Впрочем, в более поздних машинах регистры, используемые для определения адреса операнда, нашли и другие применимые. В большихステинте машин адрес, участвующий в команде неосредственно в момент выполнения (так называемый «исполнительный адрес», не совпадает со значением адресного поля, а вычисляется как значение некоторой функции. Такая функция чаще всего выглідит как сумма записанного в адресном поле значения (так называемого смеценция) и содержимого одного регистра (базы), указанного в команде, или двух регистров (базы и индекса). Например, в машине БЭСМ-6 (если отвлечься от некоторых непринципальных подробностей) формат большинства команды имеет вид, показанный на рисунке 3.
Рис. 3.
Числа в полях команд на рисунке 3 указывают длину соответствующего поля, измеренную в количестве двойных разрядов. Оперативная память БЭСМ-6 содержит 32К=2 машинных слов, а наиболее число, записываемое в адресном поле, во всяком случае меньше 2. И вот тут приходит на помощь один из шестнадцатей регистров базы, именно тот, номер (адрес) которого указаан в поле регистра базы. Исполнительным адресом команд является сумма пятнадцатирарядного значения, хранящегося в указанном регистре базы, и двенадцатирарядной величины смещения. Например, команда
03 004 0231
при условии, что в третьем регистре содержится число 12000, будет складывать (004 — код операции сложения) содержимое сумматора с числом, хранящимся по адресу 12000+231=12231, и отправлять результат в сумматор. Здесь 3 — адрес (номер) регистра базы, 12000 — база, 231 — смещение, 12231 — исполнительный адрес. Таким образом, база означает начальный адрес некоторой оперативной памяти, а адрес нужно слова в этой области получается добавлением смещения к базе. Этот способ адресации называется относительной.
Он удобен тем, что дает возможность перемещать программы или
53
части программы по всей оперативной памяти, так что программы освобождаются от необходимости следить за изменением программы.
Еще больше развищные способностиーテльной адресации получили в машинах серии EC ЭВМ. Память этих машин составляется из общиной оперативной памяти и сравнительно небольшого набора (16) регистров общего назначения, а в адресной части команды записьается чаще всего два адресовых поля. Поэтому в этих машинах существует не один, а три формата команды. Первый из них — «резистр — резистр» (рис. 4) — описывает
| Код операции | P1 | P2 |
| :— | :— | :— |
Рис. 4.
команды, которые операуют с числами, хранящимися в регистрах P1 и P2, и записывают результат по адресу P1. Второй формат — «резистр — память» (рис. 5). Здесь Адрес 2-20 операда
Рис. 5.
адрес одного из операндов (второго) задается в памяти. Исполнительный адрес получается сложением смесения CM2 со значениями, хранящимися в регистре базы B2 и регистре индекса И2. Наконец, в командах формата «память — память» (рис. 6) оба операнда расположены в основной памяти. Для каждой из них исполнительный адрес получается сложением смесения, со значением регистра базы. Кроме того (в этом особенность машин серии EC), в этом формате указывается длины Д1 и Д2 полей операндов, что дает возможность работы не только с машинными словами единого размера, но и с данными производной длины.
Вернемся еще раз к системе адресации, пропллюстрированным рисунками. Трехдресная машина (рис. 1) характерна тем, что все машинные слова в ее памяти совпадано равнозначны с точки зрения организации и времени доступа. Машины, обладающие таким свойством, называются линейными или, точнее, машинами с линейной структурой памяти. Уже в общийной одноадресной машине (рис. 2) линейность слегка нарушена: существует один особый регистр — сумматор — который может хранить информацию подобно другим машинным словам памяти, но весма отличается от них. В частности, это единственный регистр, куда результат операции может направлять без предварительных пересылок. В машинах с регистрами базы (рис. 3) линейность нарушается не только наличием базы и индекса в формате команды, но также и возможность работы с словами различной длины. Вместе с тем все эти машины в принципиах сохраняют линейную структуру основной части оперативной памяти.
А вот в машинах со стековой структурой памяти принципиу линейности нанесен уже серезный удар.
Понять, что такое стек, легче всего, представив себе стопку книг на вашем письменном столе
Adрес 1-20 операда Adрес 2-20 операда
Длина 1-20 операда
Длина 2-20 операда
54
Рис. 7.
(по английски «stack» как разознаает «стопка»). Добавлять книги в эту стопку можно, лишь положив последнюю запитересовую вас книгу на самый верх стопки. Эта же книга, положенная последней, оказывается и самой первой из доступных книг. Далее вам нужно какая-то книга в середине стопки, то первой книгой, который придает брать в ходе этого поиска, будет последняя книга, положенная на верх стопки. Стек — это такая группа машинных слов, в которой в каждой момент доступно только одно слово, а именно то, которое было записано последним. Это доступное слово в стеке называется верхушкой стека, а остальная часть стека — его телом. Добавление слова в стеке означает создание новой верхушки, предыдущая верхушка становится вторым элементом стека, частью тела. Взятие слова из стека делает верхушкой стека элемент, который до выполнения этой операции неисредственно следовал в стеке за верхушкой.
Если память ЭВМ организована в виде стека, то для выполнения многих операций можно не указать адрес операдов, если они предварительно помещены в верхушке стека или неисредственно следом за ней. Так, команда СЛ, задаваемая только кодом операции (и ничем более!), складывает два числа, одно из которых находится в верхушке стека, а другое неисредственно всегда за ним, и помещает результат в верхушку стека. Как видите, в команде нет совсем адресной части. Машины со стековой структурой памяты поэтому называют частью без адреса и. Такой термин не означает, конечно, что машины слова в стековой памяты не имеют адресов. Адреса существует, но после того, как операды посланы в стеке, нет необходимости указывать эти адреса в адресной части большинства машинных команд.
Вот как выглядит, например, программа, вычисляющая уполнившееся уже выражение в машине «Эльбрус» — самой быстродействующей советской стековой машине четвертою поколения (А — информация об адресе величины ):
ЗГЦ1 (загрузка в верхушку стека целого числа 1 — рис. 7, )
СЧВЕЛ А (помещение величины, расположенной по адресу А, в верхушку стека; прежняя верхушка погружается при этом в теле стека — рис. 7, )
РАЗДВ («разделение» верхушки: экземпляр величины, хранившейся в верхушке стека, записан теперь и в слово, неисредственно следующего за верхушкой; остальная часть стека опустилась при этом еще глубже — рис. 7, ).
РАЗДВ (еще одно «разделение»: дело в том, что в дальнейших операциях потребуется три экземпляра величины — рис. 7, )
УМН (переменное число, расположенное в двух самых верхих словах стека; результат остается в верхушке стека, а использованные операды убираются из стека — рис. 7, )
СЛ (сложение чисел, расположенных в двух верхих словах стека; результат остается в верхушке стека — рис. 7, )
ВЫЧ (вычитание: из верхушки стека — суммы — вычитается 1, расположенная в стеке сразу под верхушкой; результат остается в верхушке стека — рис. 7, )
Команды этой программы записаны в несколько упрощенном виде и не дают полного представления об очень богатой и гибкой системе команд «Эльбрус». Рассказу об этой машине будет посвящена отдельная статья в одном из следующих номеров «Кванта».