iЮГ-2. Учебный микропроцессор + Конкурс

Дата: 07.02.15
Автор:
20 комментариев
Цена: Free
Скачать


Вы видели когда-нибудь микропроцессор? Если нет — наберите это слово в вашем любимом поисковике, и затем выберите в результатах поиска картинки. Картинок этих уйма. Да вот, я прямо здесь покажу одну. Видите, сколько контактных ножек эти самые микропроцессоры имеют? Можно сказать, что среди всех микросхем они одни из самых-самых многоножек.

IMG_0066

А знаете, почему так? Сегодня у нас, помимо прочего, речь пойдёт и об этом. И… для меня это будет весьма необычный выпуск. Впервые в СВОЕЙ рубрике я буду рассказывать о СВОЁМ приложении. Да-да, сделанном своими руками. Но об этом чуть позже.

Итак, много ножек. Зачем столько? А затем, что всякий микропроцессор работает с памятью и данными. И должен сообщать окружающему миру — то бишь материнской плате и контроллерам на ней — с какими именно адресами он собирается работать, да ещё получать или передавать данные, связанные с этими адресами. Адреса же и данные суть числа.

А числа в цифровой электронике представляются двоичным способом: есть сигнал — нету сигнала. Для представления чисел 0–1023 (килобайт, коротко говоря) нужно десять разрядов. Для чисел 0–1048575 (мегабайт) уже двадцать разрядов, и т.д. Чем больше разрядность процессора, тем больше его адресное пространство и диапазон рабочих данных, тем больше ножек нужно ему, чтобы передавать по ним эти самые сигналы-разряды. Разумеется, конструкторы идут на всякие хитрости и ухищрения: передают информацию не за один раз, а в несколько порций, возлагают на один контакт несколько функций при использовании его в разных комбинациях с другими контактами… Но общий принцип таков, как описано парой предыдущих фраз, и никуда от него не деться.

Вообще, микропроцессор — крайне интересная штука. С точки зрения программиста, это довольно тупой исполнитель, способный на выполнение довольно элементарных операций. С точки зрения электронщика, это „чёрный ящик“, способный по сложным законам реагировать наборами сигналов на похожие наборы сигналов, поступающие к нему извне. Программист объясняет тупому исполнителю, чего тот должен делать в тех или иных ситуациях. Электронщик придумывает, как правильно присобачить к этому „чёрному ящику“ другие микросхемы и устройства, чтобы всё вместе оно давало программисту возможность делать именно то что нужно.

А ещё программистов и электронщиков нужно учить. А учить нужно от простого к сложному, лучшего способа пока не придумано. Значит, для начала нужен ПРОСТОЙ микропроцессор. Чтобы можно было на пальцах объяснять и разбирать элементарные вещи.

И вот в австралийском университете Нового Южного Уэльса придумали учебный процессор, которому дали наименование „4917“. В своё время я наткнулся на него, он мне понравился, я аккуратненько зафиксировал ключевую информацию в одной из своих рабочих тетрадей… ну, и стал при необходимости пользоваться. Постепенно придумывались задачки, а в обсуждениях со школьниками-студентами рождались интересные темы и идеи. Всё это тоже записывалось.

На всякий случай: процессор 4917 — это мысленная абстракция. В реальности ничего подобного не выпускается, хотя известно несколько случаев, когда такой процессор реализовывали в качестве дипломных и курсовых проектов. Но и эти реализации не заходили дальше теоретических схем, загружаемых в симуляторы цифровой электроники — то есть, опять же, оставались абстракциями. Собственно, тем-то и удобен 4917, что его вполне можно эксплуатировать „на бумажке“.

Но бумажка бумажкой, а при обучении чрезвычайно удобно, если есть возможность работать с чем-то более материальным и весомым. На бумажке же можно и ошибиться — преподаватели, знаете, тоже люди. Не говоря уже о том, что средства объективного контроля здорово облегчают преподавательский труд. А ещё, если красиво сделано, могут здорово подогреть интерес обучаемых. (:

В общем, бесплатных симуляторов 4917 в AppStore не было. Предлагать ученикам покупать для занятий платный у меня язык не поворачивался. Да и не устраивал меня этот платный симулятор по ряду причин, хотя сам я им немало попользовался, и свою службу он мне сослужил. Поэтому я взял, да и сделал свой собственный.

IMG_0067

Получилось такое вот приложение. Называется просто и без затей — „CPU 4917“, естественно бесплатное. Ориентировался я в первую очередь на вопросы, связанные с обучением программированию, но и к „железячным“ вопросам от этой поделки очень даже можно переходить.

Сделано всё на языке Smart BASIC. Про него уже был на сайте подробный обзор (хоть и не мой, но это неважно), и не так давно прошёл обзор на игру, реализованную с помощью этого же языка. Ну, а тут вот учебное наглядное пособие.

Сразу говорю, я очень скоро опубликую отдельной статьёй подробный рассказ о том, как приложение делалось. Думаю, что моим читателям будет небезынтересно почитать о программистской работе. (:

Для пользования приложением сам Smart BASIC не нужен. Хотя у заинтересованных читателей статьи есть шанс получить его в подарок… ну, об этом в конце. (: Разработчики языка по моей просьбе собрали самостоятельное приложение и отправили его в AppStore, за что я глубоко благодарен. Дело это не такое уж простое… ну, тоже расскажу, когда буду говорить про разработку.

А пока будем говорить о приложении. Но начинать нужно с устройства и принципа работы процессора 4917.

Всякий процессор имеет регистры — очень небольшие фрагменты собственной памяти, в которых может хранить какую-то внутреннюю информацию. У 4917 их четыре:

  • Указатель команд, обозначаемый IP. Содержит адрес, по которому находится команда, должная выполняться следующей.
  • Состав команды, обозначаемый IS. Содержит полный код команды, подлежащей исполнению или исполняемой прямо сейчас.
  • Регистры общего назначения, две штуки, обозначаемые R0 и R1. Отданные в полную власть программисту.

Теперь смотрите, как изящно всё это работает. Это, кстати, очень хорошее приближение к принципам работы реальных процессоров.

Вот мы щёлкнули тумблером питания, процессор ожил. Все его регистры содержат нули.

Шаг первый. Процессор требует себе из памяти значение, находящееся по адресу в регистре IP, помещает его в IS и увеличивает IP на единицу.

Шаг второй. Процессор идентифицирует считанную в IS команду. Если она требует аргумент, то действия первого шага выполняются ещё раз. В IS подгружается остаток команды.

Шаг третий. Процессор выполняет команду, содержащуюся в IS.

Шаг четвёртый. Переход к первому шагу.

Выполняемая команда может модифицировать регистр IP — тогда после выполнения произойдёт переход в программе по указанному адресу.

В реальности, конечно, всё несколько сложнее. И регистров общего назначения побольше, и специальный регистр флагов добавляется — в нём хранятся результаты проверки условий по факту выполнения некоторых действий. Имеется стек, куда можно временно помещать данные и потом извлекать их. Предусматриваются средства работы с прерываниями, позволяющими получать информацию от внешних устройств и обрабатывать её. Наконец, считывание новых команд из памяти идёт параллельно с исполнением текущих, да считанное образует некоторый запас в кэше… ну, в общем, преподавателю есть о чём тут рассказать дополнительно. Но в самых общих чертах схема именно такова.

Процессор 4917 является четырёхразрядным. У него каждый адрес представляет собой число из четырёх двоичных разрядов — от 0000 до 1111, то есть от 0 до 15 в десятичной системе. И каждая единица данных — тоже такое же число. И команд он распознаёт 16.

Когда я делал приложение, я реализовал в нём всю визуализацию в шестнадцатеричной системе счисления. Которая для данного случая является самой удобной… что бы вы на этот счёт не думали. (: Заодно и юным гениям лишний повод привыкать к этой системе.

Напомню суть. Символы 0–9 сохраняют привычную нам роль — это цифры с соответствующими числовыми значениями. А вот дальше идут ещё шесть цифр, обозначаемых начальными буквами латинского алфавита: A,B,C,D,E,F. Они имеют числовые значения 10,11,12,13,14,15 соответственно.

Итак, адреса 0–F, по которым могут храниться значения 0–F. Регистры IP,R0,R1 могут хранить эти же значения, и тоже являются четырёхбитовыми. А вот IS — это восьмибитовый регистр, он может хранить два значения. Потому что половина команд 4917 имеет двойную длину.

Теперь сами команды:

  • Команда 0 вызывает немедленный останов процессора. Каждая программа обязательно должна содержать её, иначе никогда не завершится.
  • Команды 1 и 2 выполняют сложение и вычитание. Заменяя содержимое регистра R0 суммой и разностью R0+R1 и R0-R1 соответственно.
  • Команды 3 и 4 увеличивают на единицу содержимое регистров R0 и R1 соответственно.
  • Команды 5 и 6 уменьшают на единицу содержимое регистров R0 и R1 соответственно.
  • Команда 7 замыкает цепь управления внешним устройством. В оригинальном курсе лекций, где впервые появился 4917, это цепь звонка. Практически совершенно бесполезная, она была придумана из чисто образовательных соображений: там, где процессор может замкнуть цепь звонка, он может замкнуть и цепь запуска баллистической ракеты. (:

Эти команды имели одинарную длину и никаких аргументов не требовали. А вот следующие восемь команд имеют двойную длину и их аргументом является число в следующей ячейке памяти. Мы будем обозначать его буквой х.

  • Команда выдаёт число х на принтер. Она может показаться странной, но только на первый взгляд. На самом деле это наиболее экономный в плане памяти способ хранения и печати переменных. Всё просто: если вам нужна в вашей программе печатаемая переменная — храните её значение непосредственно после команды печати.
  • Команды и Ах заносят содержимое ячейки памяти по адресу х в регистры R0 и R1 соответственно.
  • Команды Вх и Сх, напротив, заносят по адресу х содержимое регистра R0 или R1 соответственно.
  • Команда Dx вызывает в программе переход по адресу х.
  • Команда Еx вызывает в программе переход по адресу х, если содержимое регистра R0 равно нулю.
  • Команда Fx вызывает в программе переход по адресу х, если содержимое регистра R0 не равно нулю.

Вот так вот это всё устроено. Да, мало памяти и мало команд. Но тем интереснее решать задачки. (: Кстати, составлять задачки для таких ограниченных условий очень даже нелегко… но тоже интересно.

Как вы, наверно, заметили, весь интерфейс в программе англоязычный. Ибо программист, даже юный, обязан знать английский язык как минимум на уровне подписей к элементам управления и системных сообщений. (: Но я написал к приложению подробное русскоязычное руководство, которое доступно здесь.

Все эти команды перечислены на „панели управления микрокомпьютера“ в самой левой её части. Для них предложена мнемоника типа той, что используется в языке ассемблера… хотя ассемблер — это отнюдь не только мнемоника.

Несколько слов о том, как этим безобразием пользоваться. Помимо руководства.

Прежде всего, вам нужно написать программку, которая выполняет желаемые действия. НА БУМАГЕ. Лучше в той же мнемонике, она наглядна. Всё должно начинаться с нулевого адреса. Теперь, глядя в шпаргалку, выпишите последовательно коды команд вашей программы. НА БУМАГУ.

Теперь надо ввести вашу программу в память. Вот она, память и клавиатура ввода:

IMG_0068

Оранжевым подсвечен адрес, по которому будет производиться ввод. Можете просто коснуться нужного, он станет активным и подсветится. А правее вы видите значение, которое в данный момент по тому адресу находится. Нажмите на клавиатуре (она справа, под надписью INPUT DATA) нужную клавишу, соответствующий код введётся в память, а активный адрес увеличится на единицу. Можете нажимать клавишу с кодом, который нужно ввести следом, и так до ввода всей программы.

(Под клавиатурой есть тумблер ADVANCE. По умолчанию он находится в правом положении — а если перебросить в левое, то автоматического увеличения активного адреса происходить не будет.)

Вот только, прежде чем вводить свою программу, неплохо бы сбросить компьютер в полный нуль. В девственно чистое состояние. Делается очень просто — перещёлкните тумблер питания в левом нижнем углу туда-сюда. (:

Итак, вы сделали ресет, ввели в память программу… эй, не торопитесь давить кнопку RUN/STOP! Сначала сохраните копию программы во внешней памяти устройства. Это кнопка SAVE в группе STORAGE. Потом, в случае чего, вы сможете вернуть сохранённую программу в память одним нажатием кнопки LOAD.

Сбросили, ввели, сохранили? Вот теперь давите пусковую кнопку RUN/STOP. Внимательно смотрите, что делает ваша программа — то, что и было задумано, или нечто другое?

Почти наверняка она не будет делать задуманное. (: И не потому, что у вас руки кривые, а просто такова статистика. Мало — крайне мало! — программ работают так как надо с первого раза. Программу надо отладить.

В ряде случаев это можно сделать, просто понаблюдав за её поведением и выведя отсюда умозаключение, что в программе не так то-то и то-то. Берите вашу бумажку, переписывайте, правьте. Потом правьте и в памяти, запускайте по новой. Если всё мелькает слишком быстро и вы не успеваете следить за происходящим, включите тумблер SLOW в группе DEBUG. Выполнение замедлится примерно до одной команды в секунду, и каждая выполняемая команда будет отображаться мнемоникой на отладочном табло.

Если и этого мало, можно воспользоваться тумблером TRACE. Когда он включен — так называемый режим трассировки, — исполнение каждой команды сопровождается печатью отладочной информации вида X:Y или X:YZ. Она означает, что исполняется команда с код(ами) Y или YZ, находящаяся по адресу X. Оба эти тумблера можно использовать одновременно, хотя особого смысла в этом нет.

В режиме трассировки на печать уходит очень много информации, и она перестаёт помещаться в окне. Но никуда не пропадает: нажмите рядом с окном принтера кнопку, на которой изображены исписанные страницы, и вся печать скопируется в буфер обмена. Вставьте её в какой-нибудь текстовый редактор и там можете анализировать. А находящаяся рядом кнопка „страница с диагональной стрелкой“ очищает поле печати.

Когда программа отлажена, её хочется увековечить или поделиться ей с кем-нибудь. Или, например, послать на конкурс, который я обещал. (: Нет ничего проще: жмите кнопку DUMP, и содержимое памяти будет скопировано опять-таки в буфер обмена. Четырьмя группами по четыре цифры… например, вот так:

3481 B31A 3F20 0000

Теперь вы знаете почти всё, и мне осталось упомянуть только одну возможность.

Хорошим тоном считается предоставлять пользователю готовые примеры — чтобы было, с чего начинать и по чему учиться. Я включил в приложение три таких программы. Посмотреть их можно, коснувшись символа книги во вкладке с кодами команд: появятся три „листочка бумаги“. Коснитесь одного из них, и программа загрузится в память. Если передумали — коснитесь книги ещё раз, и примеры исчезнут. А их подробный разбор можно найти в руководстве.

IMG_0069

Ну, а теперь обещанный конкурс! У меня есть два промо-кода на язык программирования Smart BASIC, а у вас есть шанс получить один из них. Язык сравнительно несложный и реально мощный — о его возможностях вы можете судить хотя бы по моей поделке.

Конкурс будет состоять из двух частей — теоретической так сказать, и практической. В каждой разыгрывается свой приз, однако в случае чего можно будет наградить кого-то особо. В любом случае, два приза в одни руки не выдаются. (:

Для участия в теоретической части нужно ответить на два вопроса:

  • Если допустить, что процессор 4917 необходимо реализовать в виде настоящей микросхемы, то сколько она должна иметь контактных ножек? Их должно быть по минимуму, чтобы упростить производство, но они должны обеспечивать полноценное функционирование процессора, как описано в руководстве и реализовано в приложении. Считаем, что каждая ножка имеет ровно одну собственную функцию без всяких хитростей и комбинирования.
  • Команда процессора с кодом 7 замыкает цепь звукового сигнала (звонка). С точки зрения обучения низкоуровнему программированию она довольно бесполезна. На какую команду одинарной длины вы бы предложили её заменить? Предложение должно быть реалистичным — то есть реализуемым без существенного усложнения процессора.

Ни один из этих вопросов не имеет единственно правильного ответа, так что не стесняйтесь отвечать. (: Постарайтесь уложить ответ на каждый вопрос в один абзац (три-четыре предложения), тут больше и не нужно.

Для участия в практической части необходимо решить хотя бы одну из двух следующих задач, составив для 4917 соответствующую программу:

  • Программа должна выдать на печать в обратном порядке все нечётные шестнадцатеричные числа от F до 1.
  • По известному адресу в памяти (его выбираете вы сами) перед запуском помещают число. Программа должна выдать на печать все шестнадцатеричные числа диапазона 0–F, за исключением одного этого числа.

Обе эти задачи решаются, причём мне удалось решить их обе без использования всей доступной памяти, обойдясь меньшими объёмами. Вторая задача сложнее первой.

Решением должна быть строка шестнадцатеричных цифр, полученная при помощи кнопки DUMP приложения. К решению второй задачи нужно приложить ровно одну фразу: «число-исключение следует поместить по адресу (такому-то)».

Ответы и решения присылайте на адрес michael@ipadstory.ru с указанием темы «Конкурс». Это можно сделать до 23:59 (по Новосибирску) 14 февраля 2015 года.

Желаю удачи.

Цена: Free
Скачать

Тип программы: , , (все программы по категориям для iPad)
Размер приложения в App Store: 7.8 Мб
Язык приложения: Английский Русский
Разработчик/Издатель: Elena Kolchina
Минимальная версия iOS: 5.1.1

1 звезда2 звезды3 звезды4 звезды5 звёзд (Ещё никто не присваивал рейтинг статье. Будьте первым!)
Загрузка...


Google Plus:
Twitter:
ВКонтакте:
Facebook:
20 комментариев к записи: “iЮГ-2. Учебный микропроцессор + Конкурс”

  1. Владимир+Фант:

    Спасибо за обзор! Узнал для себя чтото новое! Приложение выполнено очень профессионально! Благодаря разработчику smart Basic Mr.Kibernetik и Спутнику-на сайте потихоньку создается дружественная коалиция любителей программирования))).

    [Ответить]

  2. Mr. K.:

    Ваше приложение навороченное, не в пример тому, которое в Апсторе висит платное и при этом вообще без дизайна.
    Моя любимая программа в вашем приложении — набить семерок и запустить!
    У Уральских пельменей есть сценка, когда к пришедшему на прием мужчине обращаются на «вы», а он никак понять не может почему — ведь он один пришел. «Разработчики языка smart BASIC», о которых упомянуто в статье, тоже оказался в такой же ситуации — до сих пор вроде один был… :D

    [Ответить]

    Michael Reply:

    А в чешском языке максимально вежливое обращение подразумевает не только множественное число, но ещё и глагольные формы третьего лица. ;Р Честно говоря, в моём представлении Smart BASIC выглядит слишком солидно, чтобы мыслить его создателя в единственном числе. Вот чисто интуитивно. Что же касается „забить память семёрками“, то это вовсе не такая ерунда. Так можно показать возможность зацикливания программы без единого оператора перехода — только за счёт переполнения регистра IP.

    [Ответить]

    Mr.K. Reply:

    Вы мне льстите :) Smart BASIC — просто небольшое приложение игрового плана. Я к нему отношусь скорее как к специфическому квесту для пытливых и креативных. Хотя очень приятно, когда кто-то его использует с настоящей пользой — у обычных игр такой возможности нет.

    [Ответить]

  3. sputnik1818:

    С принципами этого процессора я разбирался больше 1-го часа. Мне показалось никакое пояснение этой программе не поможет: если хотите разобраться, то надо совместить с практикой. То есть я запускал примерочные программы и смотрел как они работают. Потом меня наконец окончательно оценило!
    Программа мегаспецифическая, конкурс тем более. Так что даже не знаю будут ли участники. Это вызов больше для программистов:) А в учебных целях в университетах программа теперь наверняка будет пользоваться спросом по всему миру

    [Ответить]

    Mr.K. Reply:

    Это как в фильме «Последний звездный воин». Справишься с задачей — и тебя возьмут в армию спасения Вселенной от вторжения межгалактического зла! Разумеется, это под силу только избранным…

    [Ответить]

    Michael Reply:

    Мне гораздо ближе такая концепция тестирования на спасителя человечества, какая была показана в первом фильме „Люди в чёрном“. (:

    [Ответить]

    Michael Reply:

    У меня есть запасной вариант на случай, если участников не окажется. (: Но теоретическая половина никаких программистских знаний не требует. Первая задача из двух, честное слово, несложная. Вторая посложнее, но это всё же не квайн, который я хотел выставить конкурсным заданием. (: Я сам-то, если что, вообще не программист. (:

    [Ответить]

  4. yaboroda:

    Только на айпад? На телефон переделать трудно или не видите смысла? Для обучения как раз было бы удобней телефон. Айфон есть у каждого второго, а айпад дай бог у одного из 20

    [Ответить]

    Michael Reply:

    О, вы затронули интересный вопрос. Я всяко собирался рассказать насчёт „почему iPad“ в планируемой статье про разработку — подождите недельки полторы, ладно? Короткая же версия такова: в том виде, как я задумал, приложение никак не вписывалось в телефонный экран. Что касается владельцев iPhone/iPad, то у меня своя статистика. Я ведь имею дело со старшеклассниками и студентами начальных курсов, а это люди, пока сильно зависящие от родителей. И тут так: у кого родители побогаче, те обязательно имеют и телефон, и планшет. У кого победнее — те в первую очередь получают от родителей именно планшет (аргументация: планшет к учёбе приспособить всяко можно, а телефон — игрушка, и раза в полтора дороже к тому же). То есть в СВОЕЙ „экологической нише“ я НИ РАЗУ не видел подростка с айфоном, но без айпада. Наоборот — видел сколько угодно.

    [Ответить]

    Mr.K. Reply:

    Моя версия социологической тенденции такова: девушка в первую очередь купит айфон, а парень — айпад. Значит можно предположить, что Michael имеет дело в основном с мужским полом, а yaboroda — с женским.

    [Ответить]

  5. shayger:

    Проблема в том, что больнство учащихся аппараты на android.

    [Ответить]

    shayger Reply:

    Использует.

    [Ответить]

  6. Дмитрий:

    оффтопик:
    будьте добры, ткните мне пальцем в аппстор, на симулятор построения компьютерных сетей (Cisco и пр). Есть ли таковые? :(

    [Ответить]

  7. Michael:

    Конкурс состоялся, призы высланы. Результаты немного удивили — на самое сложное задание было больше всего правильных решений. (: Подведение итогов с разбором заданий и решений — через несколько дней.

    [Ответить]

    Mr.K. Reply:

    Очень интересно!

    [Ответить]

  8. Алексей:

    5B48 05F0 0000 0000 — так решается первая практическая задача. У кого-то получилось короче?

    [Ответить]

  9. Алексей:

    Команду с кодом семь было бы полезно заменить на SWAP R0, R1

    [Ответить]

  10. Алексей:

    Решение второй задачи:
    AF33 4C88 0F30 0000, число-исключение следует поместить по адресу (F).
    У кого-то получилось короче?

    [Ответить]

  11. Алексей:

    И самое главное: данный симулятор для знакомства с «азами» очень хорош. Спасибо его сздателю (Michael Balandin)

    [Ответить]

Оставить комментарий