Сайт Михаила Кирюшкина
  Главная страница  | Ассемблер для Windows
 

Предыдущая программа

Следущая программа


Привет всем, кто вошел на эту страничку!

Введение. Она посвящена программированию на ассемблере в 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 на ассемблере уже готова!

Предыдущая программа

Следущая программа

 

Hosted by uCoz