|
|
Основные шаги при создании окна: 1. Получить дискриптор Вашей программы(обязательно) 2. Получить указатель на командную строку(не обязательно) 3. Зарегистрировать класс окна(не требуется, если Вы используете встроенный тип окна, например MessageBox) 4. Создать окно(обязательно) 5. Показать окно(если хотите немедленно показать окно) 6. Обновить окно 7. Образовать бесконечный цикл, обрабатывающий сообщения окна 8. Если есть сообщения, то обработать специализированной функцией ответственной за окно 9. Выйти из программы, если пользователь закрыл окно
Разберем простую программу, которая выводит только окно.
Я взял пример программы Wap32.asm из пакета TASM и несколько упостил ее. .386 .model flat, stdcall include win32.inc Файл win32.inc содержит некоторые нужные константы и структуры extrn CreateWindowExA:PROC extrn DefWindowProcA:PROC extrn DispatchMessageA:PROC extrn ExitProcess:PROC extrn GetMessageA:PROC extrn GetModuleHandleA:PROC extrn LoadCursorA:PROC extrn LoadIconA:PROC extrn PostQuitMessage:PROC extrn RegisterClassA:PROC extrn ShowWindow:PROC extrn TranslateMessage:PROC extrn UpdateWindow:PROC .data newhwnd dd 0 msg MSGSTRUCT <?> wc WNDCLASS <?> hInst dd 0 szTitleName db 'Win32 Assembly Program',0 szClassName db 'ASMCLASS32',0 .code start: push 0 call GetModuleHandleA mov [hInst], eax Получим дискриптор программы. Далее инициализируем структуру WndClass для регистрации окна mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS clsStyle - определяет стиль класса mov [wc.clsLpfnWndProc], offset WndProc clsLpfnWndProc - указывает на процедуру окна mov [wc.clsCbClsExtra], 0 mov [wc.clsCbWndExtra], 0 mov eax, [hInst] mov [wc.clsHInstance], eax clsHInstance - содержит дискриптор программы push IDI_APPLICATION push 0 call LoadIconA mov [wc.clsHIcon], eax push IDC_ARROW push 0 call LoadCursorA mov [wc.clsHCursor], eax mov [wc.clsHbrBackground], COLOR_WINDOW + 1 mov dword ptr [wc.clsLpszMenuName], 0 mov dword ptr [wc.clsLpszClassName], offset szClassName clsLpszClassName - определяет имя класса окна push offset wc call RegisterClassA Создаем окно: push 0 push [hInst] ; дискриптор окна push 0 push 0 push CW_USEDEFAULT ; высота push CW_USEDEFAULT ; ширина push CW_USEDEFAULT ; y push CW_USEDEFAULT ; x push WS_OVERLAPPEDWINDOW ; стиль push offset szTitleName ; заголовок окна push offset szClassName ; имя класса push 0 ; дополнительный стиль call CreateWindowExA mov [newhwnd], eax newhwnd - дискриптор окна Покажем окно: push SW_SHOWNORMAL push [newhwnd] call ShowWindow Обновим окно: push [newhwnd] call UpdateWindow Создаем цикл для обработки сообщений окна msg_loop: push 0 push 0 push 0 push offset msg call GetMessageA cmp ax, 0 je end_loop push offset msg call TranslateMessage push offset msg call DispatchMessageA jmp msg_loop end_loop: выход из программы: push [msg.msWPARAM] call ExitProcess Процедура окна: WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\ wparam:DWORD, lparam:DWORD Win32 требует, чтобы EBX, EDI, и ESI были сохранены cmp [wmsg], WM_DESTROY je wmdestroy push [lparam] push [wparam] push [wmsg] push [hwnd] call DefWindowProcA jmp finish wmdestroy: push 0 call PostQuitMessage mov eax, 0 finish: ret WndProc endp ends end start На первый взгляд кажется, что слишком много написано для простой программы. На самом же деле писать все полностью не нужно, достаточно написать файл один раз, а потом использовать его как шаблон для своих новых программ. Можно создать объектный файл и использовать его как загрузочный код, а писать только процедуру окна(WinProc).
|
|
-
Assembler,
COM в Ассемблере
В этой статье будет расказано о том, как использовать COM-интерфейсы в ваших программах, написанных на ассемблере. Не будет обсуждаться, что такое COM и как он применяется, но как его можно использовать, программируя на ассемблере. Здесь будет затронуто только применение существующих интерфейсов, а не реализация своих собственных, это будет рассмотрено в другой статье....
-
Assembler,
Пишем свой загрузочный сектор
Мы будем писать загрузочный сектор для трехдюймовой дискеты с файловой системой FAT12. После окончания начальной загрузки программа POST находит активное устройство и загружает с него короткую программу загрузки ОС - загрузочный сектор. Загрузочный сектор это первый физический сектор устройства, в данном случае дискеты и его размет равен всего ничего 512 байт. С помощью этих 512 байт кода мы должны найти основную часть загрузчика операционной системы, загрузить его в память и передать ему управл...
-
Assembler,
Программирование COM портов
Порт 3F8h. Этот порт соответствует регистру передавемых данных. Для передачи в порт 3F8h необходимо записать байт передаваемых данных. После приема данных от внешнего устройства они могут быть прочитаны из этого порта. В зависимости от состояния бита управляющего слова, выводимого в управ- ляющий регистр с адресом 3F8h, назначение порта 3F8h изменяться. Если этот бит равен 0,порт используется для записи передаваемых данных.Если же этот бит равен 1, порт используется для вывода з...
-
Assembler,
Переполнение буфера
В данной статье рассматривается пример использования переполнения стека под Windows 9x на платформе Intel x86. Изложение рассчитано на читателя, понимающего принципы работы персонального компьютера и более чем поверхностно знакомого с программированием....
-
Assembler,
Виртуальный драйвер для обслуживания аппаратных прерываний
Как уже отмечалось ранее, виртуальные драйверы служат прежде всего для виртуализации аппаратуры, то есть для предоставления одновременно выполняемым задачам возможности совместного использования устройств компьютера. Измерительная или управляющая аппаратура, подключаемая к компьютеру с целью создания автоматизированной установки, вряд ли будет эксплуатироваться в многозадачном режиме, однако использование для ее управления виртуального драйвера может заметно сократить программные издержки и умен...
-
Assembler,
Опыт дизассемблирования большой .com программы
В данной статье мне хочется рассказать о дизассемблировании большой программы (графического редактора). Не будучи знатоком ассемблера, не зная до сих пор, как использовать большинство возможностей своего дизассемблера (DisDoc 2.3), я все же решился написать эту статью, так как прекрасно помню, в какой кромешной тьме начинал заниматься дизассемблированием....
-
Assembler,
Оптимизация программ на Assembler
Несмотря на все более широкое распространение языков программирования и интегрированных сред программирования, оптимизация программ на ассемблере остается актуальной темой дискуссий для программистов. Можно упомянуть, например, форум програамистов, проведенный сетью PC MagNet, который стал ареной многочисленых "дуэлей": то один, то другой участник предлагал всем желающим решить небольшую, но интересную задачу программирования - и рассматривал присылаемые решения, ожидая, кто жее и как ...
-
Assembler,
Справочник программиста на персональном компьютере фирмы IBM. Приложения
Основной единицей хранения данных в компьютере является бит. В большинстве микрокомпьютеров восемь битов объединены в байт, при этом каждый бит байта может быть установлен или "включен" (= 1) или сброшен или "выключен" (= 0), допуская 256 разных вариантов. Таким образом, в одном байте можно представить 256 разных симво- лов (расширенный набор кодов ASCII) или целое число в диапазоне от 0 до 255. Хотя мы привыкли записывать эти числа в десятичной форме, они могут зап...
|
|
|