Программные функции операционной системы Windows, страница 5

где MCG.ASM – название файла с текстом нашей программы, ключ /i указывает в TASMX путь к каталогу, где расположен файл WINDOWS.INC, а четвертый параметр TLINK описывает путь к библиотеке IMPORT.LIB. Назначение ключей /ml, /Twe изучите самостоятельно, запуская TASMX.EXE  и  TLINK.EXE  без параметров.

3. ПРОСТЕЙШЕЕ 32-х РАЗРЯДНОЕ ПРИЛОЖЕНИЕ

Начиная с процессора i386 появилась технология страничной адресации расширенной памяти ПЭВМ, при которой используются расширенные до 32 бит регистры процессора. Приложения, основанные на такой адресации, являются более устойчивыми в работе, более быстро выполняются, однако по размеру исполняемых файлов минимум в двое превосходят 16-ти разрядные приложения.

Создадим пример такого приложения, выполняющего те же функции, что и выше разобранное 16-ти разрядное приложение.

Теперь текст листинга программы начнется с указания компилятору пользоваться инструкциями минимум 386 процессора:

.386

Модель памяти для 32-х разрядных приложений – flat, то есть вся память адресуется как непрерывная область. Передача параметров между процедурой и стеком – стандартная, поэтому передаем компилятору следующие команды:

.model flat,STDCALL

Подключаемым файлом с описанием используемых системой переменных и структур теперь будет файл win32.inc:

include win32.inc          

В библиотеке функций для 32-х разрядных приложениях функция вывода сообщения на экран имеет имя MessageBoxA. Кроме того, нам понадобится функция ExitProcess, которая завершает 32-х разрядную программу и передает управление операционной системе. Использовать в 32-х разрядных приложениях функцию 4С00 прерывания 21h уже НЕЛЬЗЯ. Опишем эти функции в программе как внешние:

extrn            MessageBoxA:PROC

extrn            ExitProcess:PROC

Для совместимости текстов программ, написанных ранее для 16-ти разрядных приложений, с нашим приложением введем обозначение MessageBox, к которому мы уже привыкли и присвоим ему адрес системной функции MessageBoxA..

MessageBox       equ <MessageBoxA>

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

Опишем необходимые нам в программе данные. Менеджер 32-х битных программ в Windows уже не требует себе дополнительных 16-ти байтов в области данных нашей программы, поэтому эта часть программы примет более целенаправленный вид:

.data

szMsg           db 'Это МОЯ ПРОГРАММА',0

szCapt          db 'УРА!!',0

Область кода программы тоже упростится, поскольку в модели памяти FLAT  нет понятия «селектор», а есть только «смещение». Поэтому не надо устанавливать DS, а следует только ввести в качестве параметров процедуры нужные смещения в области данных:

.code

start:

call    MessageBox,0,offset szMsg,offset szCapt,0                     

Выход из программы осуществляем системной функцией ExitProcess, подавая ей в качестве параметра код выхода 0. Обычно в коде выхода устанавливаются биты ошибки выполнения программы. В нашем случае нет смысла устанавливать какие либо биты:

call    ExitProcess,0

Завершение листинга программы осуществляется стандартным образом:

ends

end start

Для компилирования листинга 32-х разрядного приложения используется .BAT файл, строки которого выглядят примерно следующим образом:

tasm32  /ml /iD:\A_PAPA\TASM5\INCLUDE  MSG32.asm

tlink32 /Tpe MSG32.OBJ,,,D:\A_papa\tasm5\lib\import32

где MCG32.ASM – название файла с текстом нашей программы, ключ /i указывает в TASM32 путь к каталогу, где расположен файл WIN32.INC, а четвертый параметр TLINK32 описывает путь к библиотеке IMPORT32.LIB. Назначение ключей /ml, /Tpe изучите самостоятельно, запуская TASM32.EXE  и  TLINK32.EXE  с ключом  /?