OberonCore https://forum.oberoncore.ru/ |
|
Эмулятор ГЭВМ для знакомства с машинными кодами https://forum.oberoncore.ru/viewtopic.php?f=35&t=6377 |
Страница 1 из 1 |
Автор: | kekc_leader [ Понедельник, 08 Апрель, 2019 13:16 ] | ||
Заголовок сообщения: | Эмулятор ГЭВМ для знакомства с машинными кодами | ||
В учебных целях я сделал визуальный эмулятор Гипотетической ЭВМ. Провёл с его использованием урок по программированию. Люди, никогда в жизни не программировавшие, очень хорошо въехали в программирование на машинных кодах. Этот выдуманный компьютер состоит из 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 ...
|
Автор: | Oleg N. Cher [ Понедельник, 08 Апрель, 2019 13:30 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Лучше в данном случае вместо множества IF/ELSIF использовать CASE instr. Конечно хороший оптимизирующий Си-компилятор и из этого сделает конфетку, но CASE оптимизируется проще. Там может быть даже вшита таблица переходов, для скорости. |
Автор: | Валерий Лаптев [ Понедельник, 08 Апрель, 2019 13:38 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
У меня на 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. |
Автор: | kekc_leader [ Понедельник, 08 Апрель, 2019 13:39 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Oleg N. Cher писал(а): Лучше в данном случае вместо множества IF/ELSIF использовать CASE instr. Да, я когда писал это место, подумал об этом. Тут просто была другая идея — написать так, чтобы новичок мог разобраться. |
Автор: | kekc_leader [ Понедельник, 08 Апрель, 2019 13:49 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Очень здорово, Валерий. Хорошее, интересное задание. |
Автор: | Валерий Лаптев [ Понедельник, 08 Апрель, 2019 13:59 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
У нас курс есть по архитектуре ЭВМ - там и делаем. Народ с трудом врубается в необходимость разработки формата исполняемого файла для загрузки в память ВМ... |
Автор: | kekc_leader [ Понедельник, 08 Апрель, 2019 14:07 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Хм, ну если сказано, что программа должна уметь становиться в любое место ОЗУ, то как без формата? |
Автор: | Валерий Лаптев [ Понедельник, 08 Апрель, 2019 14:36 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
kekc_leader писал(а): Хм, ну если сказано, что программа должна уметь становиться в любое место ОЗУ, то как без формата? Для меня это тоже загадка. Но почему-то многие плохо врубаются. Но если уж врубились, то дальше обучение идет значительно проще. |
Автор: | Ярослав Романченко [ Понедельник, 08 Апрель, 2019 15:16 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Вспомнился из институтских времён вполне физический аппаратный эмулятор на базе КР580ВМ80 Не помню как он назывался. Ящик серый был с магнитофон Маяк |
Автор: | Artyemov [ Понедельник, 08 Апрель, 2019 20:03 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
ГЭВМ - это калькулятор программируемый: и коды видны, и память, и условия, и циклы, и подпрограммы - все концепции в прямом смысле на ладони. Похоже, действительно настала, то, чем чем зебра заканчивается, если переизобретается велосипед 40-летней давности. Кто бы сказал, не поверил бы - "Электроника-60" включённая двумя (без третьего) тумблерами (работа с консоли без загрузки) для программирования в кодах - в 2019 - кого-то заинтересует Ж8-/ . |
Автор: | prospero78 [ Пятница, 26 Апрель, 2019 08:31 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Ярослав Романченко писал(а): Вспомнился из институтских времён вполне физический аппаратный эмулятор на базе КР580ВМ80 Не помню как он назывался. Ящик серый был с магнитофон Маяк УМПК-80. Эх, молодость... Только это не эмулятор. Это вполне себе МПК. Правда заточен он специально под учебные цели. Несколько месяцев назад нашёл его программный эмулятор. Светодиоды, кнопки, 7ми сегментные индикаторы -- даже положение такое же, как в оригинале)) |
Автор: | kekc_leader [ Воскресенье, 12 Май, 2019 22:55 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
На дальнейших занятиях выяснилось, что на ГЭВМ довольно просто пишутся программы возведения произвольного числа в произвольную степень, поиска минимального и максимального из нескольких чисел и другое. Для ГЭВМ в ходе занятий разработан мнемокод (язык ассемблера) с пятью инструкциями и объявлением переменных и меток, на котором учащиеся также пишут программы. |
Автор: | Валерий Лаптев [ Понедельник, 13 Май, 2019 05:45 ] |
Заголовок сообщения: | Re: Эмулятор ГЭВМ для знакомства с машинными кодами |
Следующие лабы у меня в Системном ПО - транслятор с ассемблера, макроассемблер, отладчик... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |