|
|

Привет всем, кто
вошел на эту страничку!
Введение. Она посвящена программированию на ассемблере в Windows.
Честно говоря я думал дать пару примеров и для DOS, но потом мне показалось,
что это не очень то и нужно в наше время - DOS с его 16-битной адресацией
сейчас используется все реже и реже, а консольный вывод (то есть такой
же как в DOS) возможен и в Windows. Впрочем если я неправ, а Вас еще интересует
и DOS - пишите и если таких писем будет много, то появятся и примеры программирования
на ассемблере в DOS. А пока разберемся с виндой. Сейчас до сих пор остается
мнение, что писать программы трудно, а на ассемблере - в особенности.
Более того, пара джентльменов утверждала, что программирование в Windows
да на ассемблере это вообще абсурд, мол это так сложно, а вот на С - вполне
реально. Такое мнение было правильным лишь много лет назад, а сейчас программа
на ассемблере может быть переписана на С и наоборот за считанные минуты,
впрочем об этом позже.
Подготовка.
Теперь что касается самих ассемблеров. Для Windows программы можно писать
в Турбо Ассемблере (продукт фирмы Borland), Макро Ассемблере (от незабвенной
Microsoft); есть и другие, но они используются реже. Как можно догадаться
программы, писанные для разных ассемблеров будут малость отличаться, но
это не главное, приспособится можно к чему угодно, а суть в том,что НОВЫЙ
турбо ассемблер с поддержкой последних процессоров и другое, что нужно
- весьма сложно, с макроассемблером проблем меньше. Итак нам понадобится
макроассемблер версии 6.14.8444
(файл ML.EXE), линкер Microsoft версии 5.12.878 (файл LINK.EXE), компиллятор
ресурсов RC.EXE и, желательно, програмку преобразования файлов типа .RES
(компиллированные ресурсы) в формат .OBJ (объектный модуль) CVTRES.EXE
- и удобный редактор текста для Windows (сам я пишу программы в Norton
Commander для Windows).
Более поздние версии допустимы, наоборот - нет.
Однако чистых ассемблера и линкера мало - нужны еще и некоторые файлы
с расширениями .INC и .LIB. Полный набор будет содержаться в исталляции
MASM 6.14.8444 (инсталяшка занимает чуть более 4М)- идеально если вы найдете
его, хотя можно попробовать найти это все и по кускам.
Итак, нашли файлы? Отлично. Теперь пара условностей. Договоримся, что
у нас всегда будет использоваться конкретный каталог - MASM32 - для всех
файлов ассемблера, причем все .inc будут храниться в \masm32\include,
а все .lib - в \masm32\lib. Этих имен я рекомендую придерживаться и далее.
Исполняемые файлы обычно содержатся в каталоге \masm32\bin, а чтобы они
вызывались из любого каталога можно добавить в начало файла autoexec.bat
cтроку типа
SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\MASM32\BIN
Если строка уже есть, но набор каталогов другой - просто добавьте в конец
существующей строки ;C:\MASM32\BIN
Закончив корректировки ОБЯЗАТЕЛЬНО ПЕРЕЗАГРУЗИТЕ КОМПЬЮТЕР - только затем
изменения вступят в силу! И еще. Создайте внутри \MASM32 каталог скажем
\MASM32\PROJECTS - в нем будут храниться написанные вами программы. Поскольку
каждая програмка для Windows состоит обычно из нескольких файлов записывайте
каждый в отдельный каталог - это не обязательно, но, поверьте мне, очень
удобно!
Основные понятия. Поскольку текст рассчитан на начинающих, то в нем
будет много недомолвок - ибо излишняя теория создает "дым" в голове, практика
ценнее. Программа, написанная для Windows имеет всегда одинаковый формат.
В начале мы всегда увидим строки
.386
; Команды процессора 80386
.model flat, stdcall ; 32-битная адресация
include \masm32\include\windows.inc ; Описания структур, констант и др.
для Windows
include \masm32\include\kernel32.inc ; Описания API влюченных в ядро
include \masm32\include\другие-нужные-файлы-включения
includelib \masm32\lib\kernel32.lib ; Нужно для корректного вызова API
ядра
includelib \masm32\lib\другие-нужные-файлы-библиотек
Скорее всего вы знаете, что API - это стандартные программы базируясь
на которых и пишут все программы для винды. Например MessageBox позволит
выдать сообщение на экран, PostQuitMessage сообщит Windows, что программа
хочет закончить работу и т.д. Все они уже готовы - остается только вызывать
их. Находятся они обычно в динамически загружаемых библиотеках - файлах
с расширением .DLL, а чтобы без проблем вызвать каждую из них и используются
разные файлы включения и библиотеки. При вызове каждой програмки надо
передавать параметры. Раньше это делалось так: параметры заталкивались
в стек (команда push) задом наперед - сначала последний, потом предпоследний
и т.д., а затем вызывалась сама программа (команда call). Например:
push addr Text2
push addr Text1
push hWnd
call MessageBox
Такая запись допускается и сейчас, но существует и более компактная:
invoke MessageBox, hWnd, Text1, Text2
Правда, invoke требует ПРОТОТИПОВ для каждой вызываемой программы, но
прототипы API готовы и хранятся в соответствующих файлах включения, а
если мы напишем свою подпрограмку - сделать прототип крайне просто. Для
этого достаточно скопировать заголовок процедуры, слово proc заменить
на proto и выкинуть все имена параметров оставив только типы. Например:
; Пусть это наша подпрограмма
MyProc proc Parm1:DWORD, Parm2:DWORD, Parm3:Byte
.......
ret
MyProc endp
;А вот прототип программы:
MyProc proto :DWORD, :DWORD, :Byte
Cегменты используются следующие:
.code - текст программы, т.е. команды процессора и вызовы подпрограмм
.data - данные, напр. Num1 dd 25
.data? - неинициализированные данные, напр. Num2 dd ?
.const - постоянные, напр. IDC_EDIT dd 1000
В общем-то неинициализированные данные и константы можно поместить в секцию
.data, но не наоборот!
Первая
программа. А теперь создадим каталог \MASM32\PROJEСTS\MsgBox и запишем
в него 2 файла. Первый назовем makeit.bat - вот его содержимое:
rem
*********** Начало файла makeit.bat ***************
\masm32\bin\Ml.exe /c /coff MsgBox.asm
\masm32\bin\Link.exe /SUBSYSTEM:WINDOWS MsgBox.obj
del *.obj
rem *********** Конец файла makeit.bat ***************
Достаточно запустить этот файл и ваша программа будет отассемблирована,
а затем линкер создаст исполняемый модуль. А вот второй файл - в нем будет
находиться текст программы - назовем его MsgBox.asm - ниже приводится
его его содержимое:
; *********** Начало файла MsgBox.asm ***************
.386
.model
flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
MsgCaption db "Это заголовок сообщения",0
MsgBoxText db "А это текст сообщения",0
.code
start:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
; *********** Конец файла MsgBox.asm
***************
Готово? Теперь запустим makeit.bat и если вы сделали все, как я рекомендовал,
то у вас появится исполняемый файл MsgBox.exe - если вы его запустите,
то увидите сообщение - и больше ничего. Возможные ошибки: Если невозможно
найти программы ML.EXE, то вы не сделали корректировок в autoexec.bat
или сделали их неправильно. Ошибки ассемблирования? Вероятно у Вас старый
файл ML.EXE или нет каких-то включаемых файлов или они устарели. Если
ругается линкер, то скорее всего вы просто используете старую версию LINK.EXE
Нет ошибок? Тогда поздравляю Вас, первая программа под Windows на ассемблере
уже готова!
|