OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 22 Сентябрь, 2019 15:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:16 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 146
Откуда: г. Рига, Латвийская ССР
В учебных целях я сделал визуальный эмулятор Гипотетической ЭВМ. Провёл с его использованием урок по программированию. Люди, никогда в жизни не программировавшие, очень хорошо въехали в программирование на машинных кодах.

Этот выдуманный компьютер состоит из 256 байтов ОЗУ и одного регистра, имеет пять инструкций (сложение, уменьшение, останов, условный и безусловный переходы).
Первое задание для учащихся — научить ГЭВМ умножать числа. Писать программу надо в машинных кодах. Занятие имеет целью ознакомить людей с тем, как работает ЭВМ, с порядком выполнения программы, с шестнадцатеричной системой счисления. Эмулятор написан на Free Oberon.

Репозиторий: https://github.com/kekcleader/gevm
Скачать EXE можно здесь: https://yadi.sk/d/iGta_X5dCdEV2g

Редактируя код на Обероне, можно легко добавить в ГЭВМ новые инструкции.

Пример обработки инструкций:
Код:
IF instr = 0E4H THEN
  mem[v3] := CHR((ORD(mem[v1]) + ORD(mem[v2])) MOD 256);
  Mark(v3);
  pc := CHR(p4)
ELSIF instr = 0A1H THEN pc := mem[p1]
ELSIF instr = 0B4H THEN
  mem[v1] := CHR((ORD(mem[v1]) - 1) MOD 256);
  Mark(v1);
  pc := CHR(p2)
ELSIF ...


Вложения:
Комментарий к файлу: ГЭВМ в работе
screenshot.png
screenshot.png [ 8.52 КБ | Просмотров: 645 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:30 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 321
Откуда: Украина, Днепропетровская обл.
Лучше в данном случае вместо множества IF/ELSIF использовать CASE instr.

Конечно хороший оптимизирующий Си-компилятор и из этого сделает конфетку, но CASE оптимизируется проще. Там может быть даже вшита таблица переходов, для скорости.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:38 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3067
Откуда: Астрахань
У меня на 2 курсе студенты пишут курсовые работы - реализация виртуальной машины.
Требования к реализации:
0. Реализовать интерпретатор как консольное приложение.
1. Объектно-ориентированный подход.
1.1 Процессор – отдельный класс, разделение на интерфейс и реализацию;
Выполнение команд – вызов функтора (не использовать оператор-переключатель!)
Память – динамический массив, поле-указатель в классе.
1.2 Команды процессора – иерархия классов-функторов; базовый класс – абстрактный класс Command с перегруженной операцией operator()

2. Разработать и описать в пояснительной записке:
– коды команд
– методы адресации операндов
– множество флагов-результатов
– форматы команд переходов (если не определены)
Обязательно должны быть реализованы команды:
2.1 Пересылки (по необходимости)
2.2 Арифметика (целые и дробные)
2.3 Сравнения (целые и дробные)
2.3 Ввод-вывод (целые и дробные)
2.4 Переходы
– безусловный
– условный
– к подпрограмме
– возврат из подпрограммы

3. Загрузчик программы для виртуальной машины – независимая функция, вызываемая главной программой интерпретатора..
3.1 Код программы для виртуальной машины должен быть записан в текстовом файле.
3.2 Формат представления кода программы в файле должен быть разработан и описан в пояснительной записке.
3.3 Загрузчик должен быть способен загружать код программы по любому адресу памяти
3.3 Главная программа должна получать имя файла как параметр командной строки, и передавать загрузчику как параметр при вызове.

Примеры заданий:
4. Двухадресная, с Регистрами Общего Назначения, универсальная адресация операндов
PSW = IP + Flags, 16+16 = 32 бит. ¬
Память – слова 16 бит, объединяются в двойные слова. Размер адреса – 16 бит.
Данные:
Целые знаковые, беззнаковые – 2 байта
Целые знаковые – 4 байта
Дробные – 4 байта
РОН – 8 штук, 16 бит; содержимое – целое со знаком, целое без знака (адрес)
Они же – 4 регистра, 32 бит, номера – четные; содержимое – целое со знаком
Они же – 4 регистра с плавающей точкой по 32 бита, номера – четные.

Структура команд: 2 байта, 4 байта, 6 байт; результат по второму адресу
КОП – 7 бит, s – 1 бит, dd – 2 бита, r1 – 3 бита, r2 – 3 бита, о1 – 16 бит, o2 – 16 бит
s – размер операнда (для целых)
s = 0 – 2 байта
s = 1 – 4 байта
dd – формат операнда (первый и второй)
dd = 00 – операнды в регистрах; o1, o2 – отсутствуют;
dd = 01 – регистр – адрес
dd = 10 – адрес – регистр
dd = 11 – адрес– адрес
Адрес = регистр + смещение (если регистр используется)
Адрес = смещение (если регистр не используется)
Особые случаи: s=1, d = 0 (аргумент в регистре) и номер регистра – нечетный
Это формат пересылок, арифметики целой, арифметики дробной;
Пересылка:
Регистр-регистр, Регистр-память, Память-регистр, Память-память
арифметика дробная, арифметика целая – то же самое
Переходы:
Безусловный (использование битов s, dd – отличается от стандартного), r1 – не используется
– s = 0: прямой, IP = адрес
– s = 1: относительный, IP = IP + адрес
dd = 10: адрес = r2
dd = 11: адрес = r2+o2
dd = 01: адрес = o2
dd = 00 – запрещено (резерв!)
Условный — то же самое, только проверяются флаги
Вызов подпрограммы — адрес возврата запоминается в первом операнде
Возврат – безусловный прямой переход (по любому варианту)
Если регистр в команде не используется, то можно использовать для дополнительных кодов операций

6. Трехадресная, с регистрами общего назначения, все операнды в регистрах
PSW = IP + Flags, 16 + 16 = 32 бит
Память: слова по 2 байта, размер адреса – 16 бит
Типы данных:
Целые знаковые, беззнаковые – 4 байта
Дробные – 4 байта
РОН – 8 штук, 32 бит – целые
Они же 8 штук, 32 бита – дробные

Структура команды: 2 байта, 4 байта; результат в первом операнде
16 бит: КОП – 7 бит, r1 ¬– 3 бита, r2 ¬– 3 бита, r3 ¬– 3 бита
32 бита: КОП – 7 бит, r1 – 3 бита, r2 ¬– 3 бита, r3 ¬– 3 бита, адрес (константа) – 16 бит
Пересылка:
Память-регистр, регистр-память, регистр–регистр;
r2 = xxx – биты пересылки
000 – регистр-регистр
001 – регистр-память, адрес (константа) в команде
011 – регистр-память, адрес = r3+константа (в команде)
101 – память-регистр, адрес (константа) в команде
111 – память-регистр, адрес = r3+константа (в команде)
010 – загрузка адреса в регистр, адрес (константа) в команде
110 – загрузка адреса в регистр, адрес = r3+константа (в команде)
100 – резерв
Арифметика целая – только на регистрах
Арифметика дробная – только на регистрах
r1 = r2 $ r3
Переходы
Безусловный прямой, r1 – не используется
r2 = xxx – тип перехода
001: прямой, IP = адрес (константа) в команде
011: прямой, IP = r3+адрес (константа) в команде
Безусловный относительный: команда формата-16: смещение = <r1r2r3>; IP = IP+смещение
Условный — то же самое, только проверяются флаги
Вызов подпрограммы — адрес возврата запоминается в r1
Возврат – безусловный прямой переход

13. Виртуальная машина RISC – Н. Вирт
Вирт Н. Построение компиляторов. – М.: ДМК Пресс, 2010. – 192 с.
Глава 9. RISC-архитектура как цель. – с. 75.

14. Виртуальная машина MMIX – Д.Кнут
Кнут Д. Искусство программирования, том 1, выпуск 1. MMIX – RISC- компьютер нового тысячелетия. – М.: ООО «И.Д. Вильямс», 2007. – 160 с.

15. Виртуальная машина – Ч. Уэзерелл
Уэзерелл Ч. Этюды для программистов. – М.: Мир, 1982. – 282 с.
Глава 25. Уча – учимся, или Моделирование большого компьютера. – с. 159.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:39 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 146
Откуда: г. Рига, Латвийская ССР
Oleg N. Cher писал(а):
Лучше в данном случае вместо множества IF/ELSIF использовать CASE instr.

Да, я когда писал это место, подумал об этом. Тут просто была другая идея — написать так, чтобы новичок мог разобраться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:49 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 146
Откуда: г. Рига, Латвийская ССР
Очень здорово, Валерий.
Хорошее, интересное задание.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 13:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3067
Откуда: Астрахань
У нас курс есть по архитектуре ЭВМ - там и делаем.
Народ с трудом врубается в необходимость разработки формата исполняемого файла для загрузки в память ВМ... :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 14:07 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 146
Откуда: г. Рига, Латвийская ССР
Хм, ну если сказано, что программа должна уметь становиться в любое место ОЗУ, то как без формата?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 14:36 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3067
Откуда: Астрахань
kekc_leader писал(а):
Хм, ну если сказано, что программа должна уметь становиться в любое место ОЗУ, то как без формата?

Для меня это тоже загадка.
Но почему-то многие плохо врубаются.
Но если уж врубились, то дальше обучение идет значительно проще.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 15:16 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1198
Откуда: Украина, Киев
Вспомнился из институтских времён вполне физический аппаратный эмулятор на базе КР580ВМ80 :)
Не помню как он назывался. Ящик серый был с магнитофон Маяк


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 08 Апрель, 2019 20:03 

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 326
ГЭВМ - это калькулятор программируемый: и коды видны, и память, и условия, и циклы, и подпрограммы - все концепции в прямом смысле на ладони.
Похоже, действительно настала, то, чем чем зебра заканчивается, если переизобретается велосипед 40-летней давности.

Кто бы сказал, не поверил бы - "Электроника-60" включённая двумя (без третьего) тумблерами (работа с консоли без загрузки) для программирования в кодах - в 2019 - кого-то заинтересует Ж8-/
.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 26 Апрель, 2019 08:31 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1113
Откуда: СССР v2.0 rc 1
Ярослав Романченко писал(а):
Вспомнился из институтских времён вполне физический аппаратный эмулятор на базе КР580ВМ80 :)
Не помню как он назывался. Ящик серый был с магнитофон Маяк

УМПК-80.
Эх, молодость...
Только это не эмулятор. Это вполне себе МПК. Правда заточен он специально под учебные цели. Несколько месяцев назад нашёл его программный эмулятор. Светодиоды, кнопки, 7ми сегментные индикаторы -- даже положение такое же, как в оригинале))


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 12 Май, 2019 22:55 
Аватара пользователя

Зарегистрирован: Среда, 22 Апрель, 2015 23:51
Сообщения: 146
Откуда: г. Рига, Латвийская ССР
На дальнейших занятиях выяснилось, что на ГЭВМ довольно просто пишутся программы возведения произвольного числа в произвольную степень, поиска минимального и максимального из нескольких чисел и другое.

Для ГЭВМ в ходе занятий разработан мнемокод (язык ассемблера) с пятью инструкциями и объявлением переменных и меток, на котором учащиеся также пишут программы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 13 Май, 2019 05:45 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3067
Откуда: Астрахань
Следующие лабы у меня в Системном ПО - транслятор с ассемблера, макроассемблер, отладчик... :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB