Программы Win32 работают в защищенном режиме, который доступен, в процессорах, начиная с 80286. Но 80286 уже давно ушел в историю. Теперь мы имеем дело с 80386 и его "потомками" (т.е. с процессорами, имеющими 32-разрядную шину данных). Каждое Windows-приложение запускается в отдельном виртуальном адресном пространстве размером почти 2 Гб. Этого нет в Win16. Все Win16-программы могут "видеть" друг друга. В Win32 ситуация иная. Это свойство снижает вероятность записи одной программой в код или данные другой.

     Модель памяти также решительно отличается от старого 16-битного варианта. В Win32 больше нет необходимости думать о модели памяти или сегментах! Существует только одна модель памяти - непрерывная. Отсутствуют сегменты по 64 K. Память представляется одним большим непрерывным пространством размером 4 Гб. Следствием этого является то, что вам нет необходимости использовать для адресации сегментные регистры; любой из них может быть использован для адресации необходимой ячейки памяти. Это сильно облегчает работу программиста. Благодаря этому программирование на Ассемблере становится таким же простым, как программирование на языке Си.

     Пример программы. Комментарии далее по тексту.

.386
.MODEL Flat, STDCALL
.DATA
<Инициализация необходимых Вам данных, числовые значения которых определены к моменту компиляции>
......
.DATA?
<Резервирование места для Ваших данных, которые определяются в процессе работы программы>
......
.CONST
<Ваши константы, т.е. данные, не изменяемые в процессе работы программы>
......
.CODE
<Метка>
<Код вашей программы>
.....
end <Метка>

     Анализ приведенной схемы программы.

.386

     Это директива, сообщающая ассемблеру использовать набор инструкций 80386. Вы также можете использовать .486, .586 но самый безопасный путь обратиться к .386.

.MODEL FLAT, STDCALL

.MODEL это директива Ассемблера, которая описывает модель памяти используемую вашей программой. В Win32 существует только одна модель - непрерывная (flat). STDCALL сообщает MASM о способе передачи аргументов в функцию (parameter passing convention). Способ передечи аргументов определяет, в какой последовательности аргументы будут передаваться в функцию: слева направо или справа налево, и каким образом будет осуществлятся коррекция стека после вызова функции. В Win16 существует два способа передачи аргументов, как в Cи и как в Паскале. Си-подобным способом аргументы передаются справа налево, то есть самый правый аргумент передается первым. Программа сама отвечает за корректировку стека после вызова. Например, в случае, если вам необходимо вызвать функцию с именем foo (int first_param, int second_param, int third_param) Си-подобным способом, код на Ассемблере будут выглядеть следующим образом:

push    [third_param]     ; Передача третьего параметра
push    [second_param]    ; далее следует второй
push    [first_param]    ; и первый
call foo
add sp, 12    ; Программа самостоятельно корректирует стек

     В Паскаль-подобном способе все наоборот по сравнению с Си-подобным. Передача аргументов осуществляется слева направо и за корректировку стека после вызова функции отвечает сама функция. Win16 использует Паскаль-подобный способ, так как для него получается минимальный размер ассемблерного кода. Си-подобный способ полезен в том случае, когда вы заранее не знаете количество передаваемых параметров в функцию, как в случае с wsprintf(). В этом случае функция не может заранее определить сколько параметров будет передано в стек, поэтому не сможет правильно провести коррекцию стека. STDCALL - является объединением Си- и Паскаль-подобного способа - агрументы передаются справа налево, но коррекцию стека после вызова функции осуществляет сама эта функция. Платформа Win32 использует исключительно STDCALL. Кроме одного случая: wsprintf(). Для этой функции используется Си-подобный способ передачи аргументов в функцию.

.DATA
.DATA?
.CONST
.CODE

     Все четыре директивы являются именами секций памяти. В Win32 сегментов нет. Но вы можете поделить все адресное пространство на секции. Начало одной секции является концом предыдущей. Существует две группы секций: секция данных и кода. Секции данных, в свою очередь делятся на 3 категории:
.DATA - В этой секции содержатся инициализируемые данные вашей программы.
.DATA? - В этой секции содержатся неинициализируемые данные вашей программы. Иногда вам просто необходимо зарезервировать некоторый объем памяти, но вы не хотите его инициализировать, тогда для этой цели используйте данную секцию.
.CONST - В этой секции содержатся константы, используемые в вашей программе. Значения в этой секции вашей программой изменяться не могут. Вам нет необходимости использовать все три секции. Пользуйтесь только теми из них, которые вам необходимы. Секция кода всего одна: .CODE. В ней содержатся все инструкции вашей программы.

<Метка>
end <Метка>

     где <Метка> это любая произвольная метка. использующаяся для определения некоторого места в программе. Обе метки должны быть идентичны. Весь ваш код должен быть расположен между строками <Метка> и end <Метка>.