Часть I
Часть II
Часть III
Часть IV
Часть V
На Хабре уже была опубликована статья, посвящённая RAM-машине.
Вообще, статья про RAM-машину есть на Википедии.
RAM-машина, которая упоминается в книге «Построение и анализ вычислительных алгоритмов» -авторы: Ахо, Хопкрофт, Ульман — имеет ограниченный набор арифметических команд, у нас же из арифметических команд будут только «сложение» и «вычитание». Кроме арифметических доступны также команды ввода-вывода, косвенной адресации и команды ветвления.
Отличием LIttle Man Computer'а (который я описывал в предыдущих частях цикла) от RAM-машины является механизм, обеспечивающий косвенную адресацию (возможность работать с числом, хранящемся в памяти, как с адресом).
Для того, чтобы работать с числом, хранящимся в памяти, как с адресом, подключим к адресному входу Памяти Данных мультиплексор MUX, осуществляющий выборку между, собственно, адресом (поступающим из Памяти Команд) и числом, представляющем адрес и хранящемся в Памяти Данных.
Будем загружать число из памяти в регистр каждый раз, когда происходит выборка новой команды из Памяти команд. При переключении мультиплексора MUX происходит переход на адрес, записанный в адресный регистр.
Также будем загружать загружать адрес команды в аккумулятор Acc как число, для этого увеличим разрядность адресного входа мультиплексора, производящего выборку данных для загрузки в аккумулятор Асс. Адрес загружается на 4ый вход мультиплексора.
Обработка команды будет производиться в два такта. Для этого подключим к тактовому генератору два D-триггера, которые будут переключать друг друга при поступлении тактового сигнала.
1ый такт осуществляет загрузку адреса в адресный регистр, 2ой такт осуществляет загрузку числа в аккумулятор Acc или в Память данных.
Подключим к аккумулятору 2 флага:
1. Флаг Acc = 0. Флаг поднимается, если содержимое Асс равно нулю.
2. Флаг Acc > 0. Флаг поднимается, если содержимое Асс больше нуля.
Получилась вот такая схема, которую можно скачать отсюда
Линия, идущая на разрешающий вход аккумулятора, нужна для того, чтобы схема не глючила.
Отключим некоторые команды и напишем программу, которая загружает нулевую ячейку Памяти данных по адресу, хранящемуся в нулевой ячейке. Будем в цикле увеличивать значение нулевой ячейки на единицу. Т.о. мы заполним Память данных порядковыми номерами.
1401 загружаем в Acc число 1
1100 прибавляем число в Acc к числу в нулевой ячейке
2000 сохраняем результат в нулевой ячейке
2080 загружаем число из Acc по адресу, на который ссылается нулевая ячейка
0010 прыгаем в начало программы
Эмулятор классической RAM-машины (с раздельными лентами чтения/записи) можно скачать отсюда.
Автор: demsp