Вкр на тему «Компьютерная игра для обучения языку ассемблер школьников старших классов» Введение
Вид материала | Документы |
- Использование элективных курсов как новое направление естественнонаучной подготовки, 949.47kb.
- Учебно-методический комплекс опд. Р. 01. Теория и методика обучения русскому языку, 515.33kb.
- Методика изучения учебной мотивации по итогам обучения в 1-м классе 1 Методика изучения, 417.39kb.
- Обобщение опыта работы по проблеме «Грамматика в курсе интенсивного обучения немецкому, 75.44kb.
- Методика развития деятельностной компоненты медиакомпетентности учащихся старших классов, 402.96kb.
- Учебно-методический комплекс дисциплины введение в методику обучения русскому языку, 266.73kb.
- Методические рекомендации по разработке заданий для школьного и муниципального этапов, 171.25kb.
- Методические рекомендации по разработке заданий для школьного и муниципального этапов, 170.7kb.
- Программа факультативных занятий по французскому языку «введение в мир иностранного, 226.34kb.
- Доклад на педагогических чтениях на тему «Развитие навыков грамотного письма у обучающихся, 63.76kb.
1 2
Логика занятия может быть любой, но как правило базовая её часть имеет следующий вид:
- lessonInit() – создание необходимого интерфейса, загрузка сцены для мини игры, инициализация переменных;
- lessonShutdown() – освобождение используемых ресурсов;
- run() – приведение мини игры в начальное состояние, запуск программы, проверка результатов запуска;
- stop() – остановка игрового процесса;
- lessonUpdate() – обновление состояния мини игры;
- checkASMCode() – вызывается извне при компиляции кода программы, используется для проверки соблюдения программой условий, необходимых для работы мини игры, например, проверка наличия в программе определенных переменных.
Также, реализована возможность создавать и использовать из lua-скрипта элементы windows-интерфейса, в частности кнопки (Button), надписи (Label), панели (Panel). Для кнопки есть возможность указать lua-функцию в качестве обработчика для события нажатия. Элементам можно изменять основные параметры, такие как:
- размер;
- положение на экране;
- видимость;
- текст;
- цвет текста;
- шрифт текста;
- фоновая картинка.
Таким образом, мини игра может не иметь 3d-сцены, а использовать специально созданный windows-интерфейс (как например, в занятии «Калькулятор»).
Вообще же, элементы windows-интерфейса используются в мини играх каждого занятия, как минимум для вывода текстовой информации.
Виртуальная машина
Виртуальной машиной (англ. virtual machine) называют программную или аппаратную среду, исполняющую некоторый код (например, байт-код или машинный код реального процессора), или спецификацию такой системы.
Виртуальная машина для языка ассемблер, созданная в рамках данного проекта, представляет собой 16-битную систему, эмулирующую работу процессора x86, а также компилятора для языка ассемблер. Компиляция текста программы производится в байт-код (машинный код), который выполняется аналогично реальному процессору. Имеется возможность выводить описание ошибок компиляции, а также осуществлять пошаговое выполнение программы и её отладку.
В виртуальной машине реализованы не все инструкции языка ассемблер, а лишь основные, также упрощен синтаксис некоторых из них, т.к. основной задачей ставится именно обучение, а не эффективное написание реальных программ.
Список поддерживаемых инструкций:
- mov - копирует данные
- add - сложение
- sub - вычитание
- inc – увеличение на 1
- dec – уменьшение на 1
- int - вызов прерывания, например, выход из программы
- push - положить значение в стэк
- pop - изъять значение из стэка
- call - вызов процедуры
- ret - выйти из процедуры
- nop - инструкция-пустышка
- loop - организация цикла
- jmp – безусловный переход
- cmp – сравнение 2х значений
- jz – переход по условию
- jnz - переход по условию
- je - переход по условию
- jne - переход по условию
- jl - переход по условию
- jg - переход по условию
Некоторая функциональность виртуальной машины (например, доступ к регистрам и выполнение программы) доступна из lua-скрипта и используется в мини играх.
Виртуальная машина: Компиляция
При компиляции программы, её текст анализируется с помощью библиотеки Lexer, на предмет наличия инструкций языка ассемблер. Для каждой инструкции, поддерживаемой виртуальной машиной, имеется код анализирования и код выполнения этой инструкции. Если при анализе текста инструкции выявлены ошибки или предупреждения, они передаются в основную программу, где показываются пользователю. При этом информация об ошибке содержит номер строки текста программы, где зафиксирована эта ошибка, для того чтобы пользователь не тратил время на поиск возможного места возникновения ошибки.
Так как разрядность виртуальной машины составляет 16 бит, то размер блока памяти, под компилируемую программу не должен превышать 64 килобайта. Именно такой блок памяти и есть в нашем распоряжении. Каждая удачно проанализированная инструкция переводится в байт код и записывается в этот блок памяти. Обобщенный формат записи инструкций выглядит следующим образом:
Код инструкции + управляющий флаг + данные
Важно отметить, что размер различных инструкций, как правило, бывает разным.
Виртуальная машина: Выполнение
Как было сказано выше, каждая инструкция имеет свою функцию выполнения:
ushort cmdExec(byte* pos), где pos – адрес в памяти, а возвращает эта функция размер инструкции, чтобы вычислить адрес следующей инструкции.
Работа программы представляет собой бесконечный цикл, в котором осуществляется движение по блоку памяти программы и выполнение инструкций. При чем выполняется та инструкция, адрес которой находится в регистре IP (в языке ассемблер этот регистр всегда содержит адрес текущей инструкции). Каждая итерация цикла выглядит следующим образом:
Виртуальная машина: Отладка
В виртуальной машине код можно не только выполнять, но и отлаживать, а сама машина может находиться в 4-х состояниях:
- Выполнение (Running) – то есть идет обычное выполнение программы, инструкция за инструкцией;
- Выполнено (Finished) – если работа программы завершилась корректно, то виртуальная машина перейдет в это состояние и прервет цикл выполнения;
- Прервано (Breaked) – означает, что выполнение программы прервано, т.е. в программе произошла ошибка или же выполнение прервано пользователем, цикл прервется;
- Пошаговое выполнение (Step Over) – говорит о том, что после каждой инструкции, выполнение программы приостанавливается и пользователь попадает в отладчик, после которого выполнение программы продолжается.
Перед каждой итерацией цикла выполнения программы, проверяется состояние виртуальной машины и в результате, выполнение либо продолжается, либо прерывается, либо прерывается выходом в отладчик.
Для сопоставления кода с текстом программы, при компиляции кода, запоминается номер строки кода и адрес в памяти, куда записывается инструкция из этой строки. А при установке точек останова, помечаются номера строк, где нужно прервать выполнение программы. Далее, при выполнении программы, осуществляется проверка на необходимость прерывания на строке кода, соответствующей адресу выполняемой инструкции.
Выход в отладчик осуществляется при помощи вызова специальной функции-прерывания, которая задается извне при инициализации виртуальной машины. В этой функции запускается цикл, аналогичный циклу основной программы. В функции-прерывании обновляется windows-интерфейс отладчика, а также происходит ожидание продолжения пользователем выполнения приостановленной программы. Через windows-интерфейс отладчика пользователь имеет доступ к регистрам виртуальной машины, в том числе имеет возможность их изменять. Также из отладчика можно продолжить выполнение программы, прервать его или осуществить пошаговое выполнение, с остановкой на следующей инстукции.
Скриптовая система
Основной задачей скриптовой системы является предоставление возможности легко и быстро связывать lua-скрипт с кодом на С++, т.е. вызывать скриптовые функции из кода С++, и наоборот, функции С++ из кода LUA. Также, есть возможность использовать в скрипте не только функции С++, но и методы классов!
Для того чтобы обеспечить доступ к C++ функционалу из lua-скрипта, используются специальные макросы скриптовой системы, например:
- SCRIPT_EXPORT_FUNC(nameInScript, funcName) – «экспортирует» C++ функцию func в скрипт, где она будет доступна под именем nameInScript;
- SCRIPT_EXPORT_STRUCT(name) – «экспортирует» структуру с именем name в скрипт;
- SCRIPT_EXPORT_MEMBER(structName, memberName) – делает доступным в скрипте метод memberName структуры structName.
При этом язык LUA не имеет явных типов данных и программист должен знать какой тип данных он использует и какие операции для него допустимы.
В результате связывание С++ кода с языком LUA происходит легко и непринужденно.
Вызов lua-функций из кода С++ также максимально прост – достаточно объявить объект вида
ReturnType script::Function
где ReturnType – может быть любым типом возвращаемого значения, а параметр funcName определяет имя скриптовой функции, после чего использовать его как обычную C++ функцию, с возможностью передачи до 7 параметров.
Код на языке LUA, как правило, хранится в .lua-файлах. Для того чтобы использовать функционал такого файла, его необходимо сначала скомпилировать. Делается это с помощью функции скриптовой системы
ErrorCode script::compileFile(const char* path)
где параметр path является строкой с путём к lua-файлу, а возвращаемое значение содержит информацию о результате компилирования.
Стоит отметить, что если в компилируемых файлах присутствуют функции с одинаковым именем, то доступны будут только последние из них. Именно поэтому, обязательные функции в lua-файлах занятий называются одинаково, чтобы после компиляции соответствующего файла доступны были именно его функции, а не предыдущие.
Система визуализации
В основе системы визуализации лежит графический движок OGRE. Для его взаимосвязи с верхним уровнем архитектуры и скриптовой системой, была создана надстройка над OGRE, функционал которой находится в пространстве имён Ogr. При этом я руководствовался идеологией, что на высоком уровне лучше вызвать одну свою функцию, вместо нескольких API-функций сторонней библиотеки, в данном случае движка OGRE. В пространстве имён Ogr, находится набор базовых функций для работы с системой визуализации, в частности
- Инициализация/Деинициализация движка
- Обновление изображения
- Загрузка/ Выгрузка сцены
- Управление объектами сцены
- Управление светом
- Служебный функционал
Весь необходимый функционал для работы с системой визуализации может быть использован и в lua-скрипте.
Система визуализации: движок OGRE
Некоторые технические особенности движка OGRE, выгодно отличающие его от конкурентов:
- Простой, понятный, независящий от используемого 3D API (DirectX/OpenGL), объектно-ориентированный интерфейс, который снижает затраты вашего времени при разработке;
- Богатая документация, которая позволяет быстро найти ответ на интересующий вопрос;
- Поддержка Direct3D и OpenGL;
- Гибкая архитектура, основанная на плагинах, позволяет расширять возможности движка без его перекомпиляции;
- Плагины для экспорта моделей из Milkshape3D, 3D Studio Max, Maya, Blender и Wings3D;
- Автоматическое управление процессами отрисовки сцены;
- Сцены основываются на иерархических графах. Узлы позволяют присоединить один объект к другому, что дает возможность одной командой передвигать, поворачивать и т.д. несколько объектов.
Архитектура движка представлена на UML-схеме ниже:
Система визуализации: вспомогательная библиотека OgreMax
Для экспорта 3d сцены к мини игре из пакета моделирования 3D Studio Max в формат, понятный OGRE, использовалась библиотека OgreMax. Она позволяет, при помощи специального плагина к 3D Studio Max 8, легко экспортировать сцену (в т.ч. источники света, камеры и пр.) и также легко её загрузить в движок. Форматом экспортируемой сцены является xml, несмотря на расширение файла (.scene). А при загрузке данных сцены, библиотека OgreMax взаимодействует с движком OGRE.
Глава №3. Реализация
§1. Проектирование интерфейсов
Windows-интерфейс программы реализован на платформе .NET Framework, тип приложения – Windows Forms. Это позволило приложить минимум усилий для его создания и получить достойный результат. В пределах этого интерфейса сосредоточено всё, что необходимо учащемуся для обучения, а именно:
- Область для работы с кодом
- Область с текстом задания
- Область для вывода отладочной информации
- Панель инструментов
- Область мини игры
Интерфейс программы можно разделить на 2 основных части: окно с мини игрой и окно для работы с кодом. Между этими окнами можно свободно переключаться с помощью вкладок на панели инструментов, за исключением ситуации, когда программа находится в режиме отладки, в этом случае переключиться на мини игру нельзя.
Окно для работы с кодом
Рассмотрим окно для работы с кодом, оно состоит из 3х частей:
- Редактор кода
- Область вывода служебной информации
- Область вывода текста задания
Редактор кода
Редактор с подсветкой синтаксиса для языка ассемблер, основан на стороннем компоненте (SyntaxHighlighter), который в свою очередь основан на компоненте RichTextBox'е. Подсветка осуществляется для 3-х категорий слов:
- Ключевые слова, синий цвет
- Комментарии, зеленый цвет
- Числа, серый цвет
Использование подсветки синтаксиса значительно облегчает читаемость и усвоение кода учащимся.
Область вывода служебной информации
Основана на компоненте TabControl, для реализации интерфейса вкладок, а также логического разделения выводимой информации. На каждой вкладке находится компонент ListView, представляющий собой элемент-список с широкими возможностями.
Предназначена для вывода следующей информации:
- Ошибки компиляции с привязкой к тексту программы. То есть, если во время компиляции кода были обнаружены синтаксические ошибки, то в соответствующий список будут выведены сообщения с описанием ошибки, а также местом её возникновения. А по двойному клику по сообщению можно сразу же переместиться к месту её возникновения в коде;
- Отладочная информация, а именно содержимое регистров процессора. Возможно редактирование выводимых значений.
Область вывода текста задания
Предназначена для вывода информации в формате RichText, так как обычный текстовый формат не столь нагляден, в нем сложно акцентировать внимание учащегося на определенных местах, к тому же он просто устарел. Область вывода текста задания основана на компоненте RichTextBox. При загрузке каждого занятия в эту область загружается текст из .doc файла, который может быть создан в редакторе Microsoft Word, что несомненно удобнее обыкновенного NotePad'а.
Таким образом, при работе с ассемблерным кодом учащийся видит перед собой всю необходимую ему информацию, что повышает удобство и эффективность как написания самого кода, так и обучения в целом.
Окно для работы с кодом в режиме отладки программы
Если во время мини игры ассемблерная программа остановилась на точке останова или произошел сбой, то учащемуся автоматически будет представлена вся необходимая информация и будет показано окно для работы с кодом.
Режим отладки выглядит следующим образом:
В нижней части окна находится область со значениями регистров, эти значения можно изменять прямо во время отладки. Система счисления которая используется для отображения значений регистров может быть либо шестнадцатеричной, либо десятичной. Переключение между доступными системами счисления производится через меню
Debug->Hexadecimal View.
Для установки точек останова, достаточно кликнуть мышкой слева от нужной строки кода. Чтобы убрать точку останова нужно просто кликнуть по ней мышкой. Также, установив курсор на нужной строке, можно использовать меню Debug->Toggle Breakpoint. Каждая точка останова изображается в виде красного кружка слева от редактора кода, не зависимо от того, в каком режиме работы находится программа.
В режиме отладки, чтобы следить за ходом выполнения программы, в виде желтой стрелочки показана следующая инструкция, которая будет выполнена.
В результате во время отладки программы учащийся имеет доступ ко всей необходимой ему информации.
Панель инструментов
Панель инструментов содержит следующие управляющие кнопки:
- Open – отображает интерфейс выбора занятий, при необходимости переключается на окно с мини игрой;
- Compile – инициирует компилирование программы;
- Continue – продолжить выполнение программы;
- StepOver – перейти к следующей инструкции (пошаговое выполнение программы);
- Stop – прервать выполнение программы;
При этом кнопки разбиты на 2 группы. Первая группа кнопок (Open и Compile) активна только в обычном режиме работы программы, а вторая группа (Continue, StepOver и Stop) активна только в отладочном режиме.
Окно мини игры
В этом окне отображается только мини игра и сопутствующие конкретному занятию интерфейсы.
§2. Поддержка пользователя
Справочная информация организована в виде файла-справки (формат .chm), и вызывается через меню Help, при этом происходит открытие файла-справки в новом окне.
Файл-справки содержит следующую информацию:
- Информацию о регистрах
- Список доступных инструкций с описанием и форматом операндов
- Ключевые слова языка ассемблер
- Пример программы
§3. Особенности реализации
С