Уроки Iczelion'а


         

Урок 1. Основы - часть 2


Суть:

Вот каркасная программа. Если что-то из кода вы не понимаете, не паникуйте. В дальнейшем я все объясню.

.386 .MODEL Flat, STDCALL .DATA <Ваша инициализируемые данные> ...... .DATA? <Ваши не инициализируемые данные> ...... .CONST <Ваши константы> ...... .CODE <метка> <Ваш код> ...... end <метка>

Вот и все! Давайте проанализируем этот "каркас".

.386

Это ассемблерная директива, говорящая ассемблеру использовать набор операций для процессора 80386. Вы также можете использовать .486, .586, но самый безопасный выбор - это указывать .386. Также есть два практически идентичных выбора для каждого варианта CPU. .386/.386р, .486/.486р. Эти "р"-версии необходимы только тогда, когда ваша программа использует привилегированные инструкции, то есть инструкции, зарезервированные процессором/операционной системой в защищенном режиме. Они могут быть использованы только в защищенном коде, например, vxd-драйверами. Как правило, ваши программы будут работать в непривилегированном режиме, так что лучше использовать не-"р" версии.

.MODEL FLAT, STDCALL

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

Под Win16 существует два типа передачи параметров, C и PASCAL. По C-договоренности, параметры передаются справа налево, то есть самый правый параметр кладется в стек первым. Вызывающий должен уравнять стек после вызова. Hапример, при вызове функции с именем foo(int first_param, int second_param, int third_рaram), используя C-передачу параметров, ассемблерный код будет выглядеть так:

рush [third_рaram] ; Положить в стек третий параметр рush [second_рaram] ; Следом - второй рush [first_рaram] ; И, наконец, первый call foo add sр, 12 ; Вызывающий уравнивает стек

PASCAL-передача параметров - это C-передача наоборот. Согласно ей, параметры передаются слева направо и вызываемый параметр должен уравнивать стек.




Содержание  Назад  Вперед