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

Директива LOCAL


Заметьте, что в Листинге 2.4 мы изменили значение регистра SP не только в начале процедуры, но и в конце (перед тем как восстановить регистр ВР). Эта техника обычно используется для размещения переменных в ассемблерных процедурах при их вызовах из языков высокого уровня.

В листинге 2.4 это делалось вручную. А вот MASM 5.1 и более поздние версии имеют встроенную директиву, которая выполняет это автоматически. Это директива LOCAL и она имеет следующий синтаксис:

LOCAL variable name: type, variable name: type, ...

(Любопытно. MASM все больше становится похож на Си. К чему бы это?) Давайте теперь напишем программу с использованием директивы LOCAL. Она называется Timer и требует одного параметра — time, который затем помещает в локальную переменную asm time. Из Си этот вызов будет выглядеть так:

Timer(25);

Листинг 2.5 показывает реализацию программы Timer на ассемблере, используя все директивы, которые мы обсудили в этой главе.

Листинг 2.5. Программа Timer.

.MODEL MEDIUM                ;используем модель MEDIUM

.CODE                        ;начало кодового сегмента

;в процессе работы функция меняет содержимое регистра АХ

_Timer PROC FAR USES AX, time:WORD   LOCAL asmt_time :WORD

mov AX, time

mov asm_time, AX

_Timer ENDP END

Эта программа оказалась бы куда длиннее, если б мы не использовали новые директивы MASM. Правда, если у вас есть только MASM версии 5.0, то вы можете обойтись и без них.

Совет

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



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