где 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 с ключом /?
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.