"Кроха": описание модели Учебная модель ЭВМ "Кроха" была предложена в 1989 году группой екатеринбургских (тогда свердловских) авторов в учебнике "Основы информатики и вычислительной техники". Это была фактически первая модель ЭВМ, предложенная для целей обучения. На ее основе можно было легко и просто объяснить, что такое ячейка памяти, машинная команда, адрес, счетчик команд, сумматор и многие другие фундаментальные понятия. "Кроха" является классическим примером трехадресной ЭВМ, т.е. в ее команде указывается 3 адреса (операнда): для 2 исходных величин и адрес ячейки, куда нужно записать результат. Общая структура команды имеет вид К О П А1 действие А2 данные А3 результат Каждая клеточка данного рисунка есть один двоичный разряд. Память у "Крохи" действительно крошечная - всего 8 ячеек! Поэтому адрес любой ячейки кодируется именно тремя двоичными разрядами (Вы, конечно, помните, что 2 3 = 8). "Для общности" код операции КОП тоже сделан 3-битным. Отсюда автоматически следует, что "Кроха" различает 8 операций. Вот их полный перечень: КОД НАЗВАНИЕ ОПЕРАЦИИ СОДЕРЖАНИЕ ОПЕРАЦИИ 000 перепись A1 ==> A3 001 сложение A1 + A2 ==> A3 010 деление A1 / A2 ==> A3 011 вычитание |A1 - A2| ==> A3 100 условный переход по = при A1 = A2 переход к A3 101 умножение A1 * A2 ==> A3 110 условный переход по > при A1 > A2 переход к A3 111 вывод и стоп вывод A1, A2, A3; стоп. Как видно из таблицы, помимо 4 арифметических действий над числами (расположенных в таблице операций несколько бессистемно), "Кроха" способна вывести все 3 указанных адреса на экран и, кроме того, осуществить 2 разновидности условного перехода. Учебная ЭВМ оперирует с целыми положительными числами. Как и команды, числа 12разрядные. Очевидно, что максимальное число, которое еще способна разместить в своей памяти "Кроха", равняется 2 12 - 1 = 4095. В случае, когда результат получается больше, он выходит за 12-разрядное машинное слово и не может быть корректно сохранен. Специалисты называют такое явление переполнением. Переполнение является аварийной ситуацией и приводит к прекращению выполнения программы. Поскольку все числа в "Крохе" должны быть целыми, деление всегда производится нацело и остаток просто отбрасывается. Например, при делении 14 на 3 получается 4, а 3 на 15 - ноль. Кстати, деление на ноль невозможно, что также является причиной аварийной остановки ЭВМ. Аналогично чтобы результат при вычитании не стал отрицательным, "Кроха" корректирует его путем взятия модуля. Например, в результате операции 3 - 5 получается число +2. При переписи информация из ячейки с адресом А1 копируется в ячейку А3. Адрес А2 при этом не имеет значения; его принято заполнять нулями. При осуществлении условного перехода "Кроха" сравнивает между собой оба операнда и в случае выполнения условия (равно или больше, в зависимости от КОП) переходит к А3: проще говоря, следующей командой будет выполняться А3. В случае невыполнения условия (например, по неравенству в первом случае) переход игнорируется и выполняется следующая команда программы. Запомните, пожалуйста, эту логику: именно она лежит в основе всех разветвлений и циклов! Все современные реальные компьютеры работают по такой логике. Подробные примеры программ для ЭВМ "Кроха" приведены на отдельной странице. Здесь только заметим, что "Кроха" всегда начинает выполнение программы с нулевого адреса. "Кроха": примеры решения задач для ЭВМ "Кроха" 1. Составить программу вычисления периметра прямоугольника по длинам сторон. (Задача N 3а из учебника) РЕШЕНИЕ Обозначим стороны прямоугольника a и b, а результат - P. Вычисления будем вести по формулам: P = a + b; P = P + P. Такая последовательность вычислений обеспечивает наиболее экономичную (с точки зрения использования числа ячеек памяти) программу, т.к. не требуется отводить специальную ячейку под число 2. Адрес Команда Расшифровка Комментарий 000 001 110 111 101 (6) + (7) ==> (5) a + b ==> P 001 001 101 101 101 (5) + (5) ==> (5) P + P ==> P 010 111 110 111 101 стоп; вывод (6), (7), (5) вывод a, b, P 011 не используется не используется 100 101 P результат 110 b исходные 111 a данные 2. Составить программу вычисления половины полной поверхности параллелипипеда по длинам ребер. (Задача N 3в из учебника) РЕШЕНИЕ Обозначим ребра параллеллипипеда a, b и c, а результат - s. Вычисления будем вести по формуле: s = ab + bc + ac = b(a + c) + ac, что уменьшит количество арифметических действий, а значит и команд. Полученную формулу удобно разбить на две: r = b(a + c); s = ac + r Адрес Команда Расшифровка Комментарий 000 001 101 111 000 (5) + (7) ==> (0) a + c ==> r [ r ] 001 101 110 000 000 (6) * (0) ==> (0) b * r ==> r [ s ] 010 101 101 111 001 (5) * (7) ==> (1) a * c ==> s 011 001 000 001 001 (0) + (1) ==> (1) s + r ==> s 100 111 001 001 001 стоп; вывод (1), (1), (1) вывод s 101 a исход- 110 b ные 111 c данные Особенностью данной задачи является нехватка ячеек памяти для проведения вычислений. Поэтому приходится помещать рабочую переменную r и результат s на место уже отработавших команд программы. Нельзя сказать, что это удобно (перед каждым запуском первые команды приходится восстанавливать!), но другого способа решения для памяти из 8 ячеек нет. 3. Написать программу нахождения наибольшего из двух хранящихся в ячейках памяти чисел. (Задача N 4 из учебника) РЕШЕНИЕ Обозначим исходные числа a и b, а результат max. Адрес Команда Расшифровка Комментарий 000 110 110 111 011 если (6)>(7), перейти к 3 сравнить a и b 001 000 111 000 101 (7) ==> (5) a ==> max 010 111 111 110 101 стоп; вывод (7), (6), (5) вывод a, b, max 011 000 110 000 101 (6) ==> (5) b ==> max 100 111 111 110 101 стоп; вывод (7), (6), (5) вывод a, b, max 101 max результат 110 b исходные 111 a данные Примечание. Вместо команды "стоп" по адресу 010 можно выполнить безусловный переход на команду 100. Казалось бы, команды безусловного перхода у "Крохи" нет. Но проанализируем команду 100 000 000 100 - если (0) = (0), переход на (100). Т.к. (0) = (0) всегда, то этот переход тоже будет происходить всегда. Чем не безусловный переход? 4. Написать программу деления двух чисел с учетом возможности деления на ноль (в последнем случае отобразить на экране все нули). РЕШЕНИЕ Обозначим исходные числа a и b, а результат d. Адрес Команда Расшифровка Комментарий 000 100 101 111 011 если (5)=(7), перейти к 3 сравнить b с 0 001 010 110 101 100 (6) / (5) ==> (4) a / b ==> d 010 111 110 101 100 стоп; вывод (6), (5), (4) вывод a, b, d 011 111 111 111 111 стоп; вывод (7), (7), (7) вывод 0, 0, 0 100 d результат 101 b исходные 110 a данные 111 000 000 000 000 0 константа 0 5. Заданы два числа a и b. Написать программу, которая большее из них делит на меньшее. РЕШЕНИЕ Обозначим результат d. Адрес Команда Расшифровка Комментарий 000 110 110 111 011 если (6)>(7), перейти к 3 сравнить a и b 001 010 111 110 101 (7) / (6) ==> (5) a / b ==> d 010 111 111 110 101 стоп; вывод (7), (6), (5) вывод a, b, d 011 010 110 111 101 (6) / (7) ==> (5) b / a ==> d 100 111 111 110 101 стоп; вывод (7), (6), (5) вывод a, b, d 101 d результат 110 b исходные 111 a данные 6. Написать программу вычисления n! РЕШЕНИЕ Обозначим k рабочую переменную, которая является текущим множителем для факториала и меняется от 1 до n. Начальное значение k придется задавать перед каждым запуском "вручную", т.к. для команды пересылки константы 1 из ячейки 7 в ячейку 4 уже не хватает памяти. То же самое можно сказать и про начальное значение n!, которое перед запуском естественно установить равным 1. Не забудьте также в ячейку 6 занести значение n + 1, которое является верхней границей цикла (цикл будет выполняться, пока k < n+1 и, следовательно, завершится после умножения на n). Адрес Команда Расшифровка Комментарий 000 101 101 100 101 (5) * (4) ==> (5) n! * k ==> n! 001 001 100 111 100 (4) + (7) ==> (4) k + 1 ==> k 010 110 110 100 000 если (6)>(4), перейти к 0 k < n + 1 ? 011 111 101 101 101 стоп; вывод (5),(5),(5) вывод n! 100 k [задать 1] рабочая ячейка 101 n! [задать 1] результат 110 n + 1 [задать] константа 111 константа 1 000 000 000 001 1 При работе с программой полезно обратить внимание на эффект переполнения, который для быстрорастущего выражения типа факториал достигается довольно быстро. В самом деле, как подробно обсуждается в учебнике, максимально допустимое число для 12разрядной "Крохи" равняется 4095. Таким образом, уже попытка вычислить 7! = 1*2*3*4*5*6*7 = 5040 приводит "Кроху" к непреодолимым вычислительным трудностям. Проверьте, как "Кроха" реагирует на переполнение. 7. Написать программу для вычисления выражения 1+2+3+4+...+n Эта задача настолько похожа на предыдущую, что тратить силы на набор решения просто не поднимается рука. Отметим только, что начальное значение суммы (в отличие от факториала) надо задавать равным 0. 8. Написать программу вычисления выражения X*2n РЕШЕНИЕ Для того, чтобы программа поместилась в память "Крохи", придется исходное выражение преобразовать к виду X*2*2*...*2 Таким образом, решение задачи теперь свелось к удвоению значения X n раз, что удобно делать путем циклического сложения ячейки "самой с собой". Адрес Команда Расшифровка Комментарий 000 001 101 101 101 (5) + (5) ==> (5) X + X ==> X 001 011 100 110 100 (4) - (6) ==> (4) n - 1 ==> n 010 110 100 111 000 если (4)>(7), перейти к 0 n > 0 ? 011 111 101 101 101 стоп; вывод (5),(5),(5) вывод X 100 n исходные дан- 101 X ные; результат 110 000 000 000 001 1 константа 1 111 000 000 000 000 0 константа 0 9. Вычислить выражение y=1*2*4*8*...*n РЕШЕНИЕ Как нетрудно видеть из формулы для y, программа должна суммировать последовательные степени числа 2. Обозначим очередную степень s. Особо отметим, что верхняя граница цикла в ячейке 7 переустанавливается программой. Вы перед пуском вводите в эту ячейку удобное для Вас значение n. Но машину это значение "не устраивает": ей требуется, чтобы верхняя граница равнялась 2 * n, только тогда последний учтенный сомножитель в цикле умножения будет равен n. Поэтому первой же командой ЭВМ удваивает 7-ю ячейку. Адрес Команда Расшифровка Комментарий 000 001 111 111 111 (7) + (7) ==> (7) n + n ==> n 001 101 101 110 110 (5) * (6) ==> (6) s * y ==> y 010 001 101 101 101 (5) + (5) ==> (5) s + s ==> s 011 110 111 101 001 если (7)>(5), перейти к 1 s < 2 * n ? 100 111 110 110 110 стоп; вывод (6),(6),(6) вывод y 101 s [задать 1] рабочая ячейка 110 y [задать 1] результат 111 n [задать], 2 * n граница цикла 10. Вычислить выражение y=1+2+4+8+...+n Задача решается аналогично. Отметим только, что верхняя граница цикла в ячейке 7 устанавливается равной n+1. Для проверки правильности результата полезно помнить, что для m слагаемых ответ может быть вычислен по формуле y = 2m - 1 11. Задача о самомодифицирующейся программе. Задано состояние памяти ЭВМ "Кроха" перед пуском (см. ниже). Определить, каков будет результат выполнения программы. КОММЕНТАРИЙ к условию. Данная задача представляет не столько практический, сколько теоретический интерес. Тем не менее, автор ее очень любит и считает важной. Дело в том, что в этой задаче отчетливо видно, что ЭВМ может сама формировать себе программу и что содержимое одной и той же ячейки памяти "Крохи" в разные моменты времени может быть и данными (числом), и командой. Не пожалейте времени на разбор этой задачи, если Вы действительно хотите глубоко понять принципы работы ЭВМ и передать свои знания ученикам !!! Начальное состояние памяти ЭВМ "Кроха" для задачи 11 Адрес Команда Расшифровка Комментарий 000 001 111 110 001 001 не имеет значения 010 не имеет значения 011 001 001 010 011 сумма ячеек (3) и (4) дает 100 110 000 000 000 команду стоп для (3) 101 001 011 100 011 (3) + (4) ==> (3) для (2) 110 000 101 000 000 сумма ячеек (6) и (7) дает 111 000 000 000 010 команду (5) ==> (2) для (1) формируем (1) (7) + (6) ==> (1) РЕШЕНИЕ Конечное состояние памяти ЭВМ "Кроха" для задачи 11 Адрес Команда Расшифровка Комментарий 000 001 111 110 001 (7) + (6) ==> (1) формируем (1) 001 000 101 000 010 (5) ==> (2) формируем (2) 010 001 011 100 011 (3) + (4) ==> (3) формируем (3) 011 111 001 010 011 стоп; вывод (1), (2), (3) стоп 100 110 000 000 000 константы со- 101 001 011 100 011 храняются без 110 000 101 000 000 изменения кро- 111 000 000 000 010 ме ячейки (3) В результате выполнения программы на экран ЭВМ будет выведено содержимое ячеек (1), (2) и (3), сформированное в ходе выполнения программы. 12*. Написать циклическую программу, заносящую 1 в ячейки (4)-(6). РЕШЕНИЕ Адрес Команда Расшифровка Комментарий 000 000 111 000 100 (7) ==> (4) 1 ==> ячейку 001 001 111 000 000 (7) + (0) ==> (0) модиф. адрес 010 110 111 110 000 если (7)>(6), перейти к 0 (6) < 1 ? 011 111 100 101 110 стоп; вывод (4),(5),(6) 100 не имеет значения 101 не имеет значения запишутся 110 [задать 0] единицы] 111 000 000 000 001 вывод ячеек [сюда 1 константа 1 Эта задача не зря помечена звездочкой. Она, по-видимому, самая трудная для понимания. В значительной мере это объясняется ее некоторой искусственностью в рамках учебной ЭВМ "Кроха". Тем не менее идея модификации адресов команд на "настоящих" ЭВМ при работе с массивами реализуется аналогично. Впрочем, если задача Вам не понравилась, можете смело ее пропустить. Для тех же, кто "вошел во вкус" или кому в наше нелегкое время посчастливилось иметь дело со способными учениками (для таких она и предназначается !), небольшой комментарий. Для проверки окончания цикла используется следующий прием. Перед запуском в ячейку (6) заносится 0, поэтому при проверке условия в команде (2) переход срабатывает: 1>0. Так продолжается до записи в ячейку (6) единицы. После этого условие перестает выполняться и цикл прекращается. © Е.А.Еремин, 1995