Программирование игр для Windows. Советы профессионала

         

Общий вид ассемблерной функции


Процедуры ассемблера очень похожи на Си-функции. У них есть начало, конец и код, расположенный в середине. В этой книге мы будем ссылаться на Microsoft macro assembler версий от 5.1 до 6.1 (MASM). Это связано с тем, что.в них уже есть директивы, упрощающие стыковку с программами на Си.

Примечание

MASM версии 5.0 подойдет для первого примера, но для успешной работы с книгой вам понадобится версия 5.1 или старше.

Прежде чем начать изучение способов передачи параметров и прочих интересных вещей, давайте посмотрим, что нам нужно как минимум для написания внешней программы на ассемблере, которую мы потом вызовем из Си. Итак, Листинг 2.1 покажет вам прототип процедуры на ассемблере.

Листинг 2.1. Прототип процедуры для MASM 5.0 и более старших версий.

.MODEL MEDIUM                ;тип модели памяти

.CODE

; начало кода

PUBLIC _function_name      ;информация для компоновщика. Функция             

;может экспортироваться

_function_name PROC FAR      ;название и тип функции(ближняя

;или дальняя). Ближние функции можно использовать для моделей

;памяти SMALL и COMPACT, а дальние применяются для моделей



;памяти MEDIUM, LARGE и HUGE.

push ВР                      ;готовим фрейм стека–пролог

;функции

mov BP,SP                    ;сохраним стек

;Работа функции

pop ВР                       ;восстанавливаем фрейм стека

;эпилог функции

_function_name ENDP          ; конец процедуры

END

;конец кода

Давайте проанализируем программу, приведенную в Листинге 2.1.

§          Первая директива, которую мы встречаем — это .MODEL. Как и компилятор Си, MASM должен знать, какая из моделей памяти используется. Ключевое слово MEDIUM означает, что мы собираемся использовать модель памяти именно типа MEDIUM. Теперь я хочу напомнить вам свойства основных моделей памяти:

·         Модель SMALL имеет один 64-килобайтный сегмент для кода и один сегмент для данных;

·         Модель COMPACT имеет один 64-килобайтный сегмент для кода и несколько сегментов данных;




·         Модель MEDIUM имеет один 64-килобайтный сегмент для данных и несколько сегментов для кода;

·         Модель LARGE имеет несколько сегментов как для кода, так и для данных;

·         Модель HUGE разрешает данным быть больше, чем 64К,но в остальном полностью похожа на модель LARGE.



Чаще всего мы будем использовать модели памяти MEDIUM и LARGE.

§          Следующая директива — PUBLIC. Она говорит MASM, что следующее имя будет экспортировано, то есть станет «видимо» из других модулей;

§          Теперь мы переходим к началу самой функции. В ассемблере функция начинается с директивы PROC, которая следует сразу за именем функции;

§          В этом месте мы находимся внутри исполняемой части кода. Первые две инструкции устанавливают стек таким образом, что процедура получает доступ к параметрам, передаваемым через стек. К этому мы еще не раз вернемся;

§          В конце процедуры мы очищаем стек;

§          В конце каждой процедуры ставится ключевое слово ENDP;

§          В одном блоке мы можем иметь сколько угодно процедур, но надо помнить, что самой последней должна быть директива END. Она сообщает ассемблеру об окончании программы.

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


Содержание раздела