Ассемблер для Windows


         

Глава Экскурс в битное программирование - часть 2


INITTASK — инициализирует регистры, командную строку и память. Входных параметров не требует. Вызывается первой. Возвращаемые значения регистров: AX = 1 (0 — ошибка), CX — размер стека, DI — уникальный номер для данной задачи, DX — параметр NCMDSHOW (см. ниже), ES — сегментный адрес (селектор) PSP, ES:BX — адрес командной строки, SI — уникальный номер для ранее запущенного того же приложения. В Windows 3.1 при запуске приложения несколько раз каждый раз в память загружается только часть сегментов, часть сегментов является общим ресурсом. Таким методом достигалась экономия памяти. В Windows 95 от этого отказались. Каждая запущенная задача является изолированной и независимой. В Windows 95 SI всегда будет содержать 0. Кроме того, данная процедура заполняет резервный заголовок сегмента данных. WAITEVENT — проверяет наличие событий для указанного приложения. Если событие есть, то оно удаляется из очереди. Вызов:

PUSH AX ; AX — номер приложения, если 0, то текущее.

CALL WAITEVENT

INITAPP — инициализирует очередь событий для данного приложения. Вызов:

PUSH DI ; уникальный номер задачи

CALL INITAPP

В случае ошибки данная функция возвращает 0, иначе ненулевое значение.

5. Некоторые параметры API-функций 16-битного приложения имеют размер 2 байта. В частности параметры WPARAM и HWND процедуры окна также имеют размер 2 байта. С четырехбайтными же параметрами приходится работать в два приема.

6. Наконец последнее отличие: сегмент данных в начале должен содержать резервный блок размером в 16 байт.

7. Интересно, что в 16-битном приложении мы можем пользоваться обычными прерываниями MS DOS, используя INT 21H. Надо только иметь в виду, какие функции прерывания имеют смысл для Windows.

25 Как Вы убедитесь, 16-битное программирование даже несколько сложнее 32-битного.

26 Надеюсь, вы помните, что разделение данных и кода на сегменты в 32-битной модели — вещь условная.

Для иллюстрации сказанного я привожу программу из моей книги [1], которую я незначительно изменил. Трансляция программы производится средствами MASM 6.1:




Содержание  Назад  Вперед