Уроки Iczelion'а



         

Урок 2. MessageBox - часть 2


Пpимеp:

Я приведу голый скелет программы ниже. Позже мы разберем его.

.386 .model flat, stdcall

.data .code start: end start

Выполнение начинается с первой инструкции, следующей за меткой, установленной после конца директив. В вышеприведенном каркасе выполнение начинается непосредственно после метки 'start'. Будут последовательно выполняться инструкция за инструкцией, пока не встретится операция плавающего контроля, такая как jmр, jne, je, ret и так далее. Эти инструкции перенаправляют поток выполнения другим инструкциям. Когда программа выходит в Windows, ей следует вызвать API функцию ExitProcess.

ExitProcess proto uExitCode:DWORD

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

ИмяФункции PROTO [ИмяПараметра]:ТипДанных,[ИмяПараметра]:ТипДанных,...

Говоря кратко, за именем функции следует ключевое слово PROTO, а затем список переменных с типом данных, разделенных запятыми. В приведенном выше примере с ExitProcess, эта функция была определена как принимающая только один параметр типа DWORD. Прототипы функций очень полезны, когда вы используете высокоуровневый синтаксический вызов - invoke. Вы можете считать об invoke как обычный вызов с проверкой типов данных. Hапример, если вы напишите:

call ExitProcess

Линкер уведомит вас, что вы забыли положит в стек двойное слово. Я рекомендую вам использовать invoke вместо простого вызова. Синтаксис; invoke следующий:

invoke выражение [, аргументы]

Выражение может быть именем функции или указателем на функцию. Параметры функции pазделены запятыми.

Большинство прототипов для API-функций содержатся в include-файлах. Если вы используете hutch'евский MASM32, они будут находится в директории MASM32/INCLUDE. Файлы подключения имеют расширение .inc и прототипы функций DLL находятся в .inc файле с таким же именем, как и у этой DLL. Hапример, ExitProcess экспортируется kernel32.lib, так что прототип ExitProcess находится в kernel32.inc.




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