Программа Hello World
.docxПрограмма, которая будет выводить на экран сообщение "Hello, world!".
Создайте текстовый файл first с расширением asm в каталоге \masm32\win32asm\0\fapp.
В файл first.asm введите следующий код без номеров строк:
01 .386
02 .model flat, stdcall
03 option casemap: none
04 include \masm32\include\windows.inc
05 include \masm32\include\user32.inc
06 includelib \masm32\lib\user32.lib
07 .data
08 szMessage byte "Hello, world!", 0
09 szCaption byte "Caption", 0
10 .code
11 start:
12 push MB_OK
13 push offset szCaption
14 push offset szMessage
15 push NULL
16 call MessageBoxA
17 ret
18 end start
Теперь нужно программу оттранслировать и скомпоновать. Для этого создайте в том же каталоге \masm32\win32asm\0\fapp командный файл make.bat:
\masm32\bin\ml.exe /c /coff first.asm > out.txt
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS first.obj >> out.txt
Ключ /с в первой строке говорит ассемблеру, что необходимо создать объектный файл, но не компоновать его. Ключ /coff говорит, что объектный файл должен иметь формат COFF.
Если вы никогда ничего не компилировали из командной строки, то у вас может возникнуть вопрос: "Что такое объектный файл?" Слово "объектный" в данном случае не имеет никакого отношения к объектно-ориентированному программированию.
Создание приложения состоит минимум из двух операций - трансляции (ассемблирования) и компоновки (связывания). На этапе трансляции происходит перевод ассемблером исходного текста в машинные инструкции и данные, которые записываются в объектный файл с расширением .obj.
Объектные файлы могут иметь различный формат. Windows поддерживает два формата: OMF (Object Module Format - старый формат, разработанный корпорацией Intel, в котором до сих пор создает объектный код Turbo Assembler) и COFF (Common Object Format - новый формат, разработанный корпорацией Microsoft).
В итоге после выполнения команд в первой строке нашего bat-файла, получаем файл first.obj. Но для того чтобы создать из него полноценное приложение, которое можно запустить на исполнение, мы должны создать исполняемый файл, то есть в данном случае exe-файл.
Для этого воспользуемся специальной программой - компоновщиком, или, как еще говорят, линкером. Линкер запускается с ключом /SUBSYSTEM:WINDOWS, который означает, что мы создаем оконное графическое приложение. Если бы мы создавали консольное приложение, которое работает в текстовом режиме в окне сеанса MS-DOS, то мы бы так и написали /SUBSYSTEM:CONSOLE. Зачем вообще такие сложности? Зачем разделять трансляцию и компоновку? Дело в том, что программа может состоять из нескольких исходных файлов (в том числе на разных языках), каждый из которых должен транслироваться отдельно. При этом файлы могут иметь внешние ссылки: разделяемые переменные, внешние процедуры и т.д. Основной задачей линкера является именно стыковка внешних ссылок и связывание нескольких объектных и ресурсных файлов в один исполняемый модуль. Оттого он и называется - линкер. Многие программисты создают свои библиотеки кода, ассемблируя исходные тексты, но не компонуя полученные объектные файлы, а собирая в другие файлы - библиотеки, которые имеют расширение .lib.
Таким образом, после запуска make.bat мы должны получить исполняемый модуль first.exe, то есть готовое приложение, которое, в сущности, делает совершенно никчемную вещь - выводит на экран окно сообщения с надписью "Hello, world!".
Если вы не знаете, то по традиции, которую ввел создатель языка С Дэннис Ричи, изучение нового языка программирования начинается с создания программы, которая каким-то образом приветствует мир, сообщая о своем успешном рождении.
Возможно, что у вас ничего не получилось, о чем я сейчас толковал. Вы запустили make.bat, но никакого first.exe не увидели. Это даже очень вероятно, если вы не схитрили и набирали текст программы вручную, а не скопировали.
Рекомендую вам все-таки набирать текст, поскольку так вы быстрее запомните необходимые команды. При наборе текста ошибка очень вероятна. Тогда откройте файл out.txt и посмотрите, какие сообщения об ошибках написали ассемблер с линкером. Исправьте их и попробуйте снова. Кстати, про out.txt. Он довольно полезен, когда ошибок так много, что они не помещаются в окне MS-DOS, которое не прокручивается. Поэтому я рекомендую процесс ассемблирования и компоновки протоколировать таким образом. Между прочим, чаще всего бывают важны именно первые ошибки, которые обычно и вылезают за пределы окна MS-DOS. Исправив первые ошибки, можно избавиться от всех остальных, которые возникли благодаря им. Программа нормально работает, но, может быть, вы хотите просмотреть ее работу в отладчике? Тогда нам необходимо скомпилировать ее с отладочной информацией. В первую строку в файле make.bat добавьте ключ /Zi, а во вторую два ключа /DEBUG /DEBUGTYPE:CV. Содержимое файла должено выглядеть следующим образом:
\masm32\bin\ml.exe /c /coff /Zi first.asm > out.txt
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /DEBUG /DEBUGTYPE:CV first.obj
>> out.txt
С ключом /Zi ассемблер создает файл с расширением .pdb (program database), который содержит символьную отладочную информацию: имена переменных, функций и т.д. Ключи линкера /DEBUG и /DEBUGTYPE:CV также создают дополнительную отладочную информацию и определяют ее формат (Microsoft Format). Обратите внимание, что размер файла first.exe теперь сильно увеличился, кроме того, в том же каталоге появился файл first.pdb. Запустите исполняемый файл из командной строки: db first.exe. Утилита NMSYM переведет отладочную информацию в формат, понятный отладчику, создав при этом файл first.nms, загрузит его и запустит программу. Затем SoftICE всплывет и прервет программу на точке входа. Указатель команд будет показывать на инструкцию, которая будет исполнена первой - push MB_OK. Оттрассируйте программу нажатием клавиш F8 (с заходом в процедуры) и F10 (без захода). После исполнения инструкции ret программа вернет управление операционной системе, в недра которой "нырнет" SoftICE. Выйдете из него с помощью команды X.
После того, как NMSYM загрузит программу и всплывет SoftICE, можно просмотреть программу в дизассемблированном или смешанном режиме последовательным нажатием клавиши F3. Если вы будете трассировать программу клавишей F8 в дизассемблированном или смешанном режиме, вы в конце концов окажетесь внутри модуля USER32.DLL в функции MessageBoxA. Вот это одна из невероятных возможностей SoftICE, позволяющая отлаживать даже системные DLL! Так что если вы обнаружите "баг" в функции MessageBoxA, не теряя времени, пишите в службу поддержки Microsoft :).