Данному образовательному сайту пришлось несколько раз менять свое имя. С 2011 года доступ к нему обеспечивается по URL
http://educomp.runnet.ru

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта

"Машина Мано": примеры программ

Пример 1

Задача. Найти разность двух чисел (пример взят из книги Мано, см. таблицу 6-9).

Решение. Следуя Мано, введем следующие обозначения для чисел:

DIF = MIN - SUB
и примем MIN=83 и SUB=-23 в десятичной системе счисления.

Поскольку в системе команд машины Мано вычитание отсутствует, придется сводить его к сложению. Прежде всего, учтем, что A - B = A + (-B). Кроме того, вспомним правила преобразования целого положительного числа в дополнительный код: чтобы получить отрицательное число (здесь лучше говорить чтобы изменить знак числа!) необходимо его проинвертировать, т.е. все 0 заменить на 1 и наоборот, и к результату прибавить 1.

В принципе перед нами типичный инженерный подход, когда ради упрощения hardware перекладывают его функции на software. Аналогичным образом, кстати, в простых машинах часто поступали с умножением и делением. В частности, организацию умножения для машины Мано можно посмотреть в одной из хороших презентаций по машине Мано, а более простое описание этого процесса на русском языке разобрать на базе эксперимента 2.5.5 в книге "Популярные лекции об устройстве компьютера" (там дана блок-схема алгоритма и ее реализация на Паскале).

Окончательная программа решения задачи выглядит следующим образом.

АдресКод АссемблерКомментерии
ORG 100 директива, задающая начальный адрес
100 2 107 LDA SUB извлекаем SUB
1017200 CMA инвертируем
1027020 INC +1, т.е. получили -SUB
103 1 106 ADD MIN +MIN: в итоге получим MIN+(-SUB)
104 3 108 STA DIF сохраним результат
105 7001 HLT стоп
106 0053 MIN,DEC 83 данные: число 83
107 FFE9 SUB,DEC -23 данные: число -23
108 0000 DIF,DEC 0 результат - пока пусть 0
END конец программы

Пример 2

Задача. Найти сумму 100 чисел, располагающихся в памяти начиная с адреса 150h (пример взят из книги Мано, см. таблицу 6-13).

Решение. Основной идеей обработки массивов является обращение к его элементам через ячейку ОЗУ, в которой последовательно формируются их адреса (в программе данная ячейка обозначается PTR (от английского pointer)). Подобный метод адресации принято называть косвенным. В современных процессорах он также широко используется, с той лишь разницей, что адрес элементов хранится не в ОЗУ, а в регистре микропроцессора.

Другая величина, позволяющая организовать циклическое суммирование, - это счетчик CTR (от английского counter). Поскольку машинам обычно проще сравнивать результат вычислений с нулем, то счетчик меняется не от 0 до 100, а от отрицательного значения -100 до 0, что обеспечивает более простую организацию ветвления.

Кстати, об организации ветвления. Поскольку в машине Мано условные переходы пропускают одну следующую команду (нетрадиционное, но легко реализуемое технически решение!), то после сразу после него ставится переход безусловный - см. пару команд с адресами 107 и 108.

Сумма накапливается непосредственно в аккумуляторе - больше нигде этот регистр не используется. Итоговый результат заносится в ячейку SUM.

Для тех, кому близок язык высокого уровня, приведем аналог программы на языке C.

int a[100]; ... int sum = 0; int i; for (i=0;i<100;i++) sum = sum + a[i];

Вот, пожалуй, и все, что требуется предварительно рассказать. Остальное должно быть понятно из нижеследующей таблицы.

АдресКод АссемблерКомментерии
ORG 100 директива, задающая начальный адрес программы
100 2 10B LDA ADS извлекаем ADS (адрес первого числа)
1013 10C STA PTR сохраняем в PTR (адрес текущего числа)
1022 10D LDA NBR извлекаем NBR (константу для счетчика циклов)
103 3 10E STA CTR сохраняем в CTR (заносим в счетчик)
104 7800 CLA очистим сумму
105 9 10C LOP,ADD PTR I прибавляем очередное число, адрес которого в PTR
106 6 10C ISZ PTR +1 в PTR; перехода не будет - результат ненулевой
107 6 10E ISZ CTR +1 в CTR; переход через 108, когда результат =0
108 4 105 BUN LOP к повторению цикла
109 3 10F STA SUM сохранить результат
10A 7001 HLT стоп
10B 0150 ADS,HEX 150 адрес первого операнда (начало массива)
10C 0000 PTR,HEX 0 адрес текущего операнда
10D FF9C NBR,DEC -100 константа для иициализации счетчика
10E 0000 CTR,HEX 0 счетчик (растет от NBR до 0)
10F 0000 SUM,HEX 0 результат - сумма
ORG 150 директива, задающая начальный адрес данных
150 004B DEC 75 массив данных
. . .
END конец программы


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com