Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программа Hello World

.docx
Скачиваний:
26
Добавлен:
10.05.2015
Размер:
21.15 Кб
Скачать

Программа, которая будет выводить на экран сообщение "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 :).