Чудеса ассемблера или самая маленькая 3D игра

СТАТЬИ > DirectX/OpenGL

Программирование игр на ассемблере (Часть 1)

—> Введение

Я уверен, что многие из вас, уже задумывались о создании игр. Многие из вас провели немало часов в интернете, в поисках какой-либо информации о том, как писать игры на чистом ассемблере. Но, к сожалению, такой информации почти нет, а тем более на русском. Я думаю, что этот туториал пополнит ряды русскоязычной документации и надеюсь, что он вам понравится.

—> О чем этот туториал ?

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

—> Для кого это ?

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

—> Что для этого надо ?

Единственное требование — это способность читать. Однако, если вы желаете писать и транслировать исходный код, то вам понадобится компилятор MASM 6.12+. Вы также можете скачать пакет MASM32, в котором есть все, что вам понадобится.
MASM32v7 можно взять здесь:
http://www.movsd.com/ или
http://wasm.ru/tools/7/masm32v7.zip или
http://spiff.tripnet.se/~iczelion/files/masm32v7.zip.

—> Почему Ассемблер?

Общеизвестно, что любой компилятор генерит код, в котором неизбежно присутствуют баги. Ассемблер — трудный язык как для понимания, так и для написания, что особенно справедливо для DOS’а. С приходом Windows многое меняется.

В чтении труден не только ассемблер, даже в Cи бывают такие дебри, что сам черт ногу сломает. Читабельность исходников зависит от квалификации программиста и умения комментировать код. Вообще-то тут еще надо разобраться, что сложнее: сложить 2 переменные на ассемблере или проследить иерархию какой-нибудь виртуальной функции? Здесь комментарий решает все.
Помните: то, что известно вам, не значит, что это же известно другим.

Далее, проблема в переносимости. Предоставленный язык ассемблера не переносим на другие платформы. Есть, конечно, способ обойти это, который позволяет вам писать код для любой x86 платформы, но его описание не входит в рамки этого туториала. Большинство игрушек пишутся под винды. Это означает, что код привязан к DirectX и к WIN32API, следовательно вы не сможете переносить код, во всяком случае, без некоторой доработки.

Конечно, ассемблер труден в понимании. На этой странице будут показаны его основы. Писать ассемблерный код под Windows, особенно с MASM, очень просто.

Это подобно написанию некоторого кода на C. Попытайтесь, и я уверен, что вы не будете разочарованы.

—> Основы Win32 ASM

Если Вы уже знакомы с языком ассемблера под windows, то можете пропустить этот раздел. Он является важным дополнением. Для его обсуждения, предполагается, что вы по крайней мере знакомы с x86 архитектурой.

Первое, что вам нужно понять, это команды (инструкции).

  • MOV
    • Эта инструкция копирует значение из одного места в другое. Вы можете копировать только из регистра в регистр, из памяти в регистр или из регистра в память. Но с помощью этой инструкции, вы не можете копировать напрямую из памяти в память. В первой строке число 30 копируется в регистр EAX. Во второй строке регистр EAX копируется в регистр EBX. В 3-ей строке регистр EAX копируется в память. В 4-ой строке регистр EAX копируется в то место памяти, куда УКАЗЫВАЕТ пойнтер my_var , причем префикс DWORD указывает на то, что пересылаются 4 байта.
  • ADD & SUB
    • Эти две инструкции выполняют сложение и вычитание, соответственно. Прибавляем 30 к содержимому регистра EAX, а затем вычитаем полученное значение из регистра EBX.
  • MUL & DIV
    • Эти две инструкции выполняют умножение и деление, соответственно. Рассмотрим пример: сначала загружаем в EAX=10 и в ECX=30. EAX по умолчанию всегда один из 2-х сомножителей, посему третья команда (в ней вы явно указываете второй сомножитель) перемножает EAX и ECX. Результат от умножения (произведение) будет находится в EAX:EDX. Перед выполнением деления, сначала Вы должны очистить регистр EDX, что и делает команда XOR, выполняя исключающее ИЛИ с самим собой. После деления, целая часть результата будет находится в EAX, а остаток (если есть) в EDX.

Вообще инструкций очень много, но этих пока достаточно для начала. Вероятно мы будем использовать и некоторые другие, но их не сложно понять, если только вы поняли основные. Теперь нам нужно разобраться с правилами вызова функций. Мы будем использовать стандартные правила, такие же как Win32 API. Что это значит, а то, что мы помещаем параметры в стек справа налево и нам также не надо будет заботиться об очистке стека от параметров, все это будет для нас прозрачно. Для вызова функции мы будем использовать псевдо-оператор INVOKE.

Далее, есть одна проблема с вызовом функций Windows. Чтобы использовать invoke, вы должны иметь прототип функции.

Вообще, MASM обеспечивает высокий уровень синтаксиса при написании. В нем есть конструкции, позволяющие писать логику If-Then-Else и циклы For loops аналогично сишным конструкциям.

—> Разработка

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

Как говорится, сначала было слово. Для написания игры нужно представить в голове, как она будет работать. Иногда просто полезно описать СЛОВАМИ то, что вы хотите видеть в своей игре.

Простая часть закончена, теперь нужно продумать все детали. Будут ли в игре элементы соревнования? Нужны ли опции сохранения/загрузки? Сколько уровней? Что должно происходить в конце уровня? Имеется ли вводный экран? И еще много, много вопросов.

После этого нужно будет приниматься за наброски уровней. Какой должен быть экран и интерфейс? Это не обязательно должно быть точно так, но это даст реальную картину, как должна выглядеть финальная версия игры.

—> Код

Всегда имеет смысл насыщать код возможно большим количеством комментариев, чем лично я, например, всегда пренебрегаю.

Далее следует примерная схема организации ассемблерного игрового кода:

Вот мы и подошли к концу первой статьи. А теперь хорошая новость — весь скучный материал в основном позади. Есть еще и плохая новость — вы не видели код, который будет в следующей статье. 🙂

  [C] Chris Hobbs, пер. UniSoft

© 2002-2007 wasm.ru — all rights reserved and reversed

Основные команды языка ассемблер

По назначению можно выделить команды (в скобках приводятся примеры мнемонических кодов операций команд ассемблера ПК типа IBM PC):

l выполнения арифметических операций (ADD и ADC — сложения и сложения с переносом, SUB и SBB — вычитания и вычитания с заемом, MUL и IMUL — умножения без знака и со знаком, DIV и IDIV — деления без знака и со знаком, CMP — сравнения и т. д.);

l выполнения логических операций (OR, AND, NOT, XOR, TEST и т. д.);

l пересылки данных (MOV — переслать, XCHG — обменять, IN — ввести в микропроцессор, OUT — вывести из микропроцессора и т. д.);

l передачи управления (ветвления программы: JMP — безусловного перехода, CALL — вызова процедуры, RET — возврата из процедуры, J* — условного перехода, LOOP — управления циклом и т. д.);

l обработки строк символов (MOVS — пересылки, CMPS — сравнения, LODS — загрузки, SCAS — сканирования.

Эти команды обычно используются с префиксом (модификатором повторения) REP;

l прерывания работы программы (INT — программные прерывания, INTO — условного прерывания при переполнении, IRET — возврата из прерывания);

l управления микропроцессором (ST* и CL* — установки и сброса флагов, HLT — останова, WAIT — ожидания, NOP — холостого хода и т. д.).

С полным списком команд ассемблера можно познакомиться в работах [1, 10, 35].

Команды пересылки данных

l MOV dst, src — пересылка данных (move — переслать из src в dst).

Пересылает[1]: один байт (если src и dst имеют формат байта) или одно слово (если src и dst имеют формат слова) между регистрами или между регистром и памятью, а также заносит непосредственное значение в регистр или в память.

Операнды dst и src должны иметь одинаковый формат — байт или слово.

Src могут иметь тип: r (register) — регистр, m (memory) — память, i (impedance) — непосредственное значение. Dst могут быть типа r, m. Нельзя в одной команде использовать операнды: rsegm совместно с i; два операнда типа m и два операнда типа rsegm). Операнд i может быть и простым выражением:

mov AX, 156*10H

mov AX, (152 + 101B) / 15

и т. п.

Вычисление выражения выполняется только при трансляции. Флаги не меняет.

l PUSH src — занесение слова в стек (pushпротолкнуть; записать в стек изsrc). Помещает в вершину стека содержимое src — любого 16-битового регистра (в том числе и сегментного) или двух ячеек памяти, содержащих 16-битовое слово. Флаги не меняются;

l POP dst — извлечение слова из стека (pop — вытолкнуть; считать из стека в dst). Снимает слово с вершины стека и помещает его в dst — любой 16-битовый регистр (в том числе и сегментный) или в две ячейки памяти. Флаги не меняются.

В командах PUSH и POP операнды dst и src могут быть только типов r и m.

Предыдущая12345678910111213Следующая


Дата добавления: 2016-04-02; просмотров: 548;


ПОСМОТРЕТЬ ЕЩЕ:

В.И. Юров: Справочник по языку Ассемблера IBM PC

19.09.2006

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

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

Материал книги организован в форме уроков.

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

Остальные разделы книги непосредственно посвящены описанию самого языка, его синтаксическим конструкциям, правилам построения и отладки программ, машинным командам и многому другому.

Особое место в справочном пособии уделено специальным возможностям Ассемблера таким, как  структуры данных, макросредства, модульное программирование.

Заключительные разделы книги повествуют о современных микропроцессорах фирмы Intel.

В книге приведено множество примеров с подробными описаниями.

Книга может быть использована как учебник или справочное пособие.

Скачано: 16121 раз

Скачать книгу

 

Комментарии

Дмитрий, 01.09.2011 12:01

Прочтём, прокоментируеМ!

hj, 24.11.2011 11:46

Администрации сайта огромное спасибо за очень ценный труд!:)

Данил, 14.05.2012 06:49

А это точно полная и точная версия этой книги? Я оттуда брал в свое время для курсовика машинные описания команд (форматы команд, где в каких битах чего было расписано), а тут смотрю этой информации нет. А вот опять понадобилась..

Данил, 14.05.2012 07:49

Вот картинка обложки та, которая и нужна, а сама книга это не специальный справочник, а просто какой-то справочник

Матвей, 02.05.2013 20:08

Сайт оч хороший:) можно быстро и без проблем найти и скачать необходимую инфу. Большое спасибо администрации сайта!

Игнатий, 26.11.2016 22:59

Сайт очень хороший , Спасибо !

Борис, 19.01.2017 21:52

да

 

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

Добавить комментарий

Закрыть меню