Говорят, что ассемблер мертв. Но нет ничего более далекого от истины, чем это утверждение. Во-первых, потому, что он не может умереть, пока существуют компьютеры. Ведь ассемблер является "родным" языком микропроцессора. Во-вторых, потому, что еще не перевелись люди, которые могут подписаться под словами Б. Пастернака "Во всем мне хочется дойти до самой сути". Такие люди, например, из любопытства разбирают будильники до последнего винтика. Или программируют на ассемблере.
  Многие считают, что ассемблер чрезвычайно трудный язык - для написания, для чтения и для отладки. Я же считаю, что ассемблер прост во всех отношениях. Кроме того, ассемблер - это красивый и элегантный язык, хотя на первый взгляд он состоит из нечитабельных слов-уродов: jz, movsz, lodsw, xchg, cdq и т.д. Уверяю вас, ассемблер стоит того, чтобы его по-настоящему полюбить.
  Я постараюсь писать достаточно подробно и понятно, но желательно, чтобы вы уже знали какой-нибудь язык программирования высокого уровня: C/C++, Pascal, Perl, Visual Basic. Рассылка будет выходить раз в две недели. По крайней мере, постараюсь придерживаться этого графика. С любыми пожеланиями, замечаниями и предложениями обращайтесь по адресу: vkim@aport2000.ru
  Макроассемблер корпорации Microsoft (MASM) превосходно подходит для разработки приложений для Win32. Однако многим было сложно его использовать из отсутствия полноценной документации, программной библиотеки и заголовочных файлов с константами, структурами и прототипами функций. В разное время предпринимались попытки восполнить этот пробел. Например, пакет win32asm (Philippe Auphelle), пакет walk32 (Sven B. Schreiber). Но наибольшее распространение из-за полноты и удобства получил пакет MASM32 (Steve Hutchesson, Iczelion, Ernest Murphy и другие).
  Он включает в себя текстовый редактор Qeditor, курс уроков по созданию Windows-приложений на MASM, программную библиотеку, необходимые заголовочные файлы, примеры программ, файлы помощи и множество полезных утилит. MASM32 свободно распространяется в Интернете. Благодаря доступности и мощи MASM32 большинство разработчиков на ассемблере для Win32 сейчас используют именно этот пакет. И мы тоже в наших упражнениях будем использовать MASM32. Его инсталляция очень проста и не должна вызывать каких-либо затруднений. Создайте каталог \MASM32\Win32Asm\0 и сохраните в нем файлы, прилагающиеся к данному выпуску в качестве примеров кода. По мере выпуска новых номеров вы будете создавать каталоги 1, 2, 3 и т.д.
  В принципе после инсталляции MASM32 можно сразу приступать к созданию программ. Однако я советую вам подобрать для себя более удобный текстовый редактор, чем Qeditor. Несмотря на то, что это очень мощный редактор, специально созданный для использования совместно с MASM32, он обладает одним существенным недостатком: в нем отсутствует подсветка синтаксиса.
  Сейчас имеется множество редакторов, которые могут подсвечивать синтаксис ассемблера. Очень удобен, например, UltraEdit. Многие предпочитают MultiEdit for Windows (MEW), который является чемпионом среди редакторов по количеству функций.
  Лично я использую редактор файлового менеджера FAR с установленным плагином Colorer. Это очень удобно, так как при написании программы постоянно приходится работать с различными файлами - редактировать и запускать BAT-файлы, просматривать заголовочные файлы и т.д. И при этом файловый менеджер всегда под рукой. Кстати, Colorer поддерживает подсветку синтаксиса не только MASM, но и множества других языков и типов документов. Если учесть, что Colorer позволяет пользователю самому осуществлять любые настройки, а для редактора FAR можно создавать макросы и писать плагины, то этот тандем является очень мощным и удобным инструментом для программиста. Кстати говоря, изучив данный курс и прочитав документацию к FAR, вы сможете писать для него плагины на ассемблере, и это будет делать не сложнее, чем на С++. Таким образом, я всем своим читателям рекомендую при разработке ассемблерных программ использовать редактор FAR и плагин Colorer.
  Хотя MASM32 включает в себя специальную библиотеку для упрощения отладки программ, этого, конечно, недостаточно. Необходим полноценный отладчик. Но сегодняшний день отладчик SoftICE корпорации Compuware оставил всех своих конкурентов далеко позади. SoftICE позволяет отлаживать практически любой код, в том числе код самой операционной системы, потому что он полностью независим от Windows и работает в качестве промежуточного звена между операционной системой и аппаратным обеспечением. Это позволяет программисту в режиме отладки заглянуть внутрь виртуальных драйверов, которые работают в нулевом кольце защиты процессора, системных DLL (kernel32, user32, gdi32 и др.). Такого, насколько мне известно, не позволяет больше ни один отладчик, работающий на одном компьютере. Отладчики ядра, как правило, работают на двух компьютерах, соединенных модемным кабелем. Кроме того, SoftICE может п ерехватывать любые сообщения Windows, вызовы API-функций, ставить точки останова на области памяти. За это его особенно любят хакеры. Для нас с вами как прикладных программистов также очень важно, что SoftICE полностью поддерживает символьную отладку. То есть можно загрузить в него символьную отладочную информацию своей программы и пошагово пройтись по сомнительному участку кода.
  Я использую SoftICE из пакета Numega DriverStudio 1.5, но, думаю, что для наших целей подойдет любая версия для Windows. При установке укажите порт, к которому подключена мышь, а также выберите драйвер вашей видеокарты или стандартной драйвер SoftICE. Я предпочитаю стандартный драйвер и "оконный" режим. Во время установки позвольте инсталлятору отредактировать файл Autoexec.bat для автоматической загрузки отладчика.
  Для того чтобы вызвать SoftICE, нужно нажать комбинацию CRTL+D. Когда появится окно SoftICE, необходимо его настроить, чтобы в нем было удобно работать. Подберите размер шрифта командами SET FONT 2, SET FONT 3 и т.д. Затем подберите максимальное количество строк, помещающихся на экране, командой LINES. Ширина по умолчанию установлена в 80 символов, но ее также можно отрегулировать командой WIDTH, хотя я обычно оставляю, как есть. Теперь дайте команду WD 4. Появится окно дампа памяти в 4 линии. SoftICE должен выглядеть примерно так:

--------------------------------------------------------------------------------
EAX=00005305   EBX=C4920074   ECX=C14698E4   EDX=00000000   ESI=C1476EC0
EDI=C49202B0   EBP=67890000   ESP=C4687E2C   EIP=000080D2   o d I s z a P c
CS=0128   DS=0030   SS=0030   ES=0030   FS=0078   GS=0030
--------------------------------------------------byte-------------------PROT16-
0030:00000000 9E 0F C9 D8 65 04 70 00-16 00 C9 09 65 04 70 00 ....e.p.....e.p.
0030:00000010 65 04 70 00 54 00 FF F0-58 7F 00 F0 FF E7 00 F0 e.p.T...........
0030:00000020 00 00 00 C9 D2 08 A3 0A-6F EF 00 F0 6F 00 F0 00 .........o...o..
0030:00000030 6F EF 00 F0 6F EF 00 F0-9A 00 C9 09 65 04 70 00 o...o.......e.p.
-----Cancel_Call_When_Idle+002C------------------------------------------PROT16-
0128:80D1  POPF
0128:80D2  CLS
0128:80D3  RETF
0128:80D4  POPF
0128:80D5  STC
0128:80D6  RETF
0128:80D7  CMP     AL,13
0128:80D9  NOP
0128:80DA  NOP
0128:80DB  JBE     80E1
--------------------------------------------------------------------------------
:rs
:g
WINICE: Free32  Obj=01 Mod=NOTEPAD
WINICE: Free32  Obj=02 Mod=NOTEPAD
WINICE: Free32  Obj=03 Mod=NOTEPAD
WINICE: Free32  Obj=04 Mod=NOTEPAD
WINICE: Free32  Obj=05 Mod=NOTEPAD
WINICE: Free16  Sel=351F
:X
--------------------------------------------------------------------------------
X, XFRAME, XG, XP, XRSET, XT                                            KERNEL32
--------------------------------------------------------------------------------
  Самое верхнее окно показывает состояние регистров процессора. Его размер изменить нельзя, но можно скрыть командой WR. Вывести его снова можно с помощью той же команды. Под ним находится окно дампа памяти. Третье окно сверху - окно кода, в котором показывается либо код в виде символьной информации, либо в дизассемблированном, либо смешанном виде. Высота окна устанавливается командой WC X, где Х - количество линий. Скрыть и снова отобразить его можно командой WC без параметров. Обратите внимание, что в строке состояния всегда показывается подсказка при наборе команд. Получить справку о команде можно, дав команду H X, где Х - имя команды. Если дать команду H без параметров, то SoftICE выведет информацию обо всех командах.
  Поэкспериментируйте с разными командами, не бойтесь чего-нибудь испортить. Только перед этим сохраните все не сохраненные файлы. Очень важно освоиться в SoftICE, преодолеть страх перед ним. Я знаю людей, у которых при одном упоминании о нем шевелятся волосы, как при воспоминании о ночном кошмаре. Однако SoftICE - это очень мощный, удобный и приятный инструмент программиста. Думаю, что к концу курса вы полюбите его настолько, что любая машина без него будет казаться вам неполноценной.
  Вы, наверное, подумываете теперь о том, как сохранить изменения в настройках, которые мы сейчас произвели? Это совершенно правильный ход мыслей. Выходим из SoftICE, нажав снова CTRL+D или F5 и отправляемся в директорию, куда установлен SoftICE (я надеюсь, вы уже используете FAR?). Там находим файл winice.dat. Открываем его и ищем строку
INIT="X;"
  Это строка инициализации, в которой указываются начальные настройки отладчика. Вот как выглядит эта строка у меня:
INIT="SET FONT 2;LINES 40;WD 4;FAULTS OFF;X;"
  Укажите в ней свои настройки, которые вам покажутся удобными. Кстати, о команде FAULTS OFF. Укажите ее обязательно, так как она запрещает отладчику всплывать при возникновении GPF - General Protected Fault, когда система выдает на экран окно сообщения типа:


  Таких ошибок у вас будет много, поэтому очень неудобно, если отладчик будет всплывать всякий раз, когда произойдет GPF. Включить эту функцию обратно можно командой FAULTS ON.
  После того, как мы отредактировали строку инициализации, обратим внимание на строку PHYSMB, которая расположена выше. В этой строке указывается объем RAM, имеющейся на вашем компьютере. Я заметил, что если указать точный объем RAM, то в Windows возникает странный "глюк": после выхода из отладчика курсор мыши начинает скакать по экрану, как сумасшедший, запускает ярлыки, изменяет размеры окон. Управлять мышью становится совершенно невозможно. Остается только перезагрузить компьютер. Если оставить строку PHYSMB без изменений, то такой "глюк" все равно случается, но гораздо реже.
  Теперь перейдем в конец файла, где вы найдете раздел, начинающийся словами "Examples of export symbols that can be included for Windows 95". Удалите комментарии (точку с запятой) со всех строк, которые расположены ниже. В них прописаны пути к системным DLL. Это необходимо сделать для того, чтобы SoftICE всегда загружал таблицы экспорта системных DLL. Объясню на примере, зачем это нужно. Допустим, мы вызываем функцию MessageBoxA. В дизассемблированном виде в SoftICE ее вызов будет выглядеть примерно так:
call 0044F2A1
  Согласитесь, это нам мало что говорит. Если загрузить в SoftICE имена экспортируемых функций модуля USER32.DLL, среди которых MessageBoxA, то в окне кода мы увидим вместо адреса инструкцию в виде:
call USER32!MessageBoxA
  Измените диск и пути, если Windows на вашем компьютере установлен в другую папку, нежели С:\Windows.
  Кстати говоря, все эти изменения в файле winice.dat можно произвести с помощью утилиты Symbol Loader, которая входит в состав пакета SoftICE. Выберите сами, что вам удобнее. Для того чтобы все изменения вошли в силу, перезагрузите компьютер.
  Основная задача Symbol Loader - загружать в SoftICE символьную отладочную информацию, чем мы сейчас и займемся. Запустите Symbol Loader, выберите пункт меню File-Open Module и найдите файл testdb.exe, который вы должны были сохранить в каталоге C:\masm32\Terra\0\Testdb. Появится сообщение:
C:\masm32\Terra\0\Testdb\testdb.exe opened successfully
  Затем выберете пункт Module-Load, после чего всплывет SoftICE и в нем вы должны увидеть мой комментарий:
Hello, these are comments!!!
  Это означает, что символьная информация нормально загрузилась и приложение можно отлаживать. Если вы не увидели комментария, попробуйте понажимать клавишу F3, которая переключает окно для отображения кода в дизассемблированном и смешанном виде. После этого загрузите модуль снова.
  Однако есть и другой способ загружать символьную информацию, которым я обычно сам пользуюсь и вам рекомендую. В состав пакета SoftICE входит утилита NMSYM, которая запускается с ключами из командной строки. В архиве, прилагающемся к этому выпуску, вы найдете файл db.bat, состоящий из одной строки:
nmsym /translate:source,package,always /source:. /load:execute,break %1
  Сохраните его в каталоге \MASM32\BIN и пропишите в переменной окружения PATH путь к каталогу, куда установлен SoftICE, и путь к директории \MASM32\BIN. В Windows 9x это можно сделать в файле Autoexec.bat таким образом:
SET PATH = %PATH%;C:\MASM32\BIN;C:\PROGRA~1\NUMEGA\DRIVER~1\SOFTICE;
  После перезагрузки компьютера перейдите в каталог \masm32\Terra\Testdb и в командной строке задайте команду: db testdb.exe. Должна произойти загрузка отладочной информации и всплытие отладчика. Нажмите F5 для возврата в Windows.
  Я описал здесь процесс установки и настройки отладчика для Windows 9x, но думаю, что у вас не возникнет никаких затруднений и для Windows NT/2000.
  Как это ни странно, но Microsoft не включила в последние версии MSDN документацию по MASM. Говорят, она есть в MSDN Archive Edition, что еще более странно, если учесть тот факт, что Microsoft до сих пор поддерживает, развивает и распространяет макроассемблер, правда, в составе других продуктов. Например, Visual C++ 6.0 Processor Pack или Windows 98 DDK. Полная документация поставлялась вместе с MASM, когда он распространялся как отдельный продукт. Постарайтесь ее найти. В ее состав входит книга Microsoft MASM Programmer's Guide. Ее недостаток в том, что она практически полностью посвящена вопросам программирования 16-разрядного процессора под DOS, и только две главы из нее рассказывают о программировании для Win32. Однако поскольку другой официальной документации у меня нет, эту книгу я всегда держу у себя под рукой. Пришлось распечатать ее и переплести, так как в электронном виде она существует в виде разрозненных документов MS Word. Много документации можно найти на сайте корпорации Intel, с которой желательно ознакомиться, если вы захотите очень глубоко изучить работу микропроцессора.
  Вообще, по ассемблеру существует немало литературы. Но в основном опять же в них рассматриваются вопросы программирования под DOS. Даже в книгах, выпущенных в последнее время. Кому это нужно? Непонятно.   Вот несколько книг из моей библиотеки:
  • Том Сван. Освоение Turbo Assembler. Второе издание. Киев, Москва, Санкт-Петербург: Диалектика, 1996.
  • В.Юров, С.Хорошенков. Assembler. Санкт-Петербург, Москва, Харьков, Минск: Питер, 1999.
  • В.Григорьев. Микропроцессор i486. Архитектура и программирование. В 4-х книгах. М.: Гранал, 1993.
  • С.Зубков. Assembler для DOS, Windows и UNIX. М.: ДМК, 2000.
  • Г.Майко. Assembler для IBM PC. М.: Бизнес-Информ, 1997.
  Кроме того, книги можно найти в Интернете.
  Конечно, если мы говорим о пакете MASM32, то неплохо бы прочитать документацию, которая имеется в каталоге \masm32\help. Для начинающих там имеется документ "Introduction to 32 bit Assembler", появившийся вместе со вторым сервис-паком. Также в каталоге \masm32\Iczelions имеется замечательный курс уроков по созданию Windows-приложений с использованием пакета MASM32. Но он рассчитан на тех, кто уже знаком с языком ассемблера.
  Хотя в MSDN нет документации по MASM, все-таки желательно установить эту кладезь знаний, если вы собираетесь программировать под Windows. У меня проинсталлирована версия "MSDN 2000 - January 2000", но говорят, что есть и более поздние версии. Кроме того, я держу у себя старую документацию Win32 Programmer's Reference. Сейчас она распространяется вместе с Borland C++ 5.0 и Borland Delphi 5.0. Можно найти ее и в сети, но размер основного файла win32.hlp составляет почти 24 MB. Сказать по правде, этой документацией я пользуюсь намного чаще, чем MSDN, поскольку последняя долго грузится, долго открывает нужную страницу и вообще весьма неповоротлива. К MSDN я обращаюсь только, когда ищу что-то специфичное и нестандартное. Однако выбор, как всегда, за вами. Разумеется, вам необязательно собирать всю ту литературу и документацию, которую я перечислил. Но я приветствую, если вы в процессе изучения нашего курса будете иметь под рукой Microsoft MASM Programmer's Guide и MSDN/Win32 Programmer's Reference.
  В сущности, первую программу вы уже видели - testdb.exe. Но напишем еще одну. Она будет выводить на экран сообщение "Hello, world!". Создадим текстовый файл first с расширением asm в каталоге \masm32\terra\0\fapp. Вообще-то расширение может быть любым, но традиционно файлы реализации в программах на ассемблере имеют расширение .asm, а заголовочные файлы (файлы интерфейса) имеют расширение .inc. В файл first.asm введем следующий код (Colorer-то, надеюсь, установили?) без номеров строк:
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\terra\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. Кстати говоря, ни MASM, ни TASM, в отличие от компиляторов языков высокого уровня, не поставляются вместе с программной библиотекой. Например, для Visual Basic 6.0 библиотекой является msvbvm60.dll ("виртуальная машина Microsoft Visual Basic 6.0"), для MS VC++ - msvcrt.dll ("ран-тайм библиотека для Microsoft Visual C++") и некоторые другие файлы. А программистам на ассемблере остается только самим создавать программные библиотеки. Но в общем-то вам не придется много работать в этом направлении, так как команда MASM32 распространяет пакет вместе с готовой библиотекой MASM32.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 :).
  Пока не будем сильно углубляться в разбор написанной нами программы first.asm. Однако скажу, что в целом она отражает общую структуру программ написанных на макроассемблере.
  Программа, как вы видите, состоит из заголовка (строки 1-6), глобальных переменных (секция инициализированных данных, строки 7-9), собственно кода (секция кода, строки 10-17) и конца программы (строка 18).
  Первая строка говорит ассемблеру, что необходимо разрешить команды 386 процессора. Этого обычно хватает, но можно написать и .486, и .586. Во второй строке определяется плоская модель памяти и декларируется соглашение о вызове процедур STDCALL. О плоской модели памяти мы будем говорить в следующей статье, когда будем разбирать архитектуру процессора, а о соглашении STDCALL в статье "Работа со стеком". В строках 4-5 подключаются заголовочные файлы. Практически всегда в программах, написанных с использование пакета MASM32 первым должен подключаться файл windows.inc. В нем определены необходимые константы, структуры и прототипы некоторых функций. Например, константы MB_OK и NULL (строки 12 и 15) определены в этом файле.
  Что касается строк 5 и 6, то пока будет достаточно, если я скажу, что в них определяется имя функции MessageBoxA с количеством предаваемых аргументов, и говорится, что ее надо искать в модуле user32.dll. Сказанное лишь отдаленно напоминает, что происходит на самом деле, но мы будем подробно разбирать вопросы вызова функций из DLL позже. В секции инициализированных данных (строки 7-9) объявляются две глобальные переменные типа byte. Далее начинается секция кода (строка 10). Ниже ее расположена точка входа в программу (строка 11). В строках 12-16 вызывается функция MessageBoxA, в результате которой на экране появляется окно сообщения с соответствующей надписью. Инструкция ret (строка 17) возвращает управление операционной системе, когда работа нашей программы завершена.
  Конец программы определяется в строке 18. На самом деле эта инструкция выполняет еще одну очень важную работу: говорит компоновщику, что смещение start является точкой входа в программу.