Assembler & Win32
- « Предыдущая стр.
- Следующая стр. »
Программирование на ассемблере под Win32 воспринимается весьма не однозначно. Считается, что написание приложений слишком сложно для применения ассемблера. Собственно обсуждению того насколько оправдана такая точка зрения и посвящена данная статья. Она не ставит своей целью обучение программированию под Win32 или обучение ассемблеру, я подразумеваю, что читатели имеют определённые знания в этих областях.
В отличие от программирования под DOS, где программы написанные на языках высокого уровня (ЯВУ) были мало похожи на свои аналоги, написанные на ассемблере, приложения под Win32 имеют гораздо больше общего. В первую очередь, это связано с тем, что обращение к сервису операционной системы в Windows осуществляется посредством вызова функций, а не прерываний, что было характерно для DOS. Здесь нет передачи параметров в регистрах при обращении к сервисным функциям и, соответственно, нет и множества результирующих значений возвращаемых в регистрах общего назначения и регистре флагов. Следовательно проще запомнить и использовать протоколы вызова функций системного сервиса. С другой стороны, в Win32 нельзя непосредственно работать с аппаратным уровнем, чем “грешили” программы для DOS. Вообще написание программ под Win32 стало значительно проще и это обусловлено следующими факторами:
— отсутствие startup кода, характерного для приложений и динамических библиотек написанных под Windows 3.x;
— гибкая система адресации к памяти: возможность обращаться к памяти через любой регистр общего назначения; “отсутствие” сегментных регистров;
— доступность больших объёмов виртуальной памяти;
— развитый сервис операционной системы, обилие функций, облегчающих разработку приложений;
— многообразие и доступность средств создания интерфейса с пользователем (диалоги, меню и т. п.).
Современный ассемблер, к которому относится и TASM 5.0 фирмы Borland International Inc., в свою очередь, развивал средства, которые ранее были характерны только для ЯВУ. К таким средствам можно отнести макроопределение вызова процедур, возможность введения шаблонов процедур (описание прототипов) и даже объектно-ориентированные расширения. Однако, ассемблер сохранил и такой прекрасный инструмент, как макроопределения вводимые пользователем, полноценного аналога которому нет ни в одном ЯВУ.
Все эти факторы позволяют рассматривать ассемблер, как самостоятельный инструмент для написания приложений под платформы Win32 (Windows NT и Windows 95). Как иллюстрацию данного положения, рассмотрим простой пример приложения, работающего с диалоговым окном.
Пример 1. Программа работы с диалогом
>IDEAL
>P586
>RADIX 16
>MODEL FLAT
>%NOINCL
>%NOLIST
>include "winconst.inc" ; API Win32 consts
>include "winptype.inc" ; API Win32 functions prototype
>include "winprocs.inc" ; API Win32 function
>include "resource.inc" ; resource consts
>MAX_USER_NAME = 20
>DataSeg
>szAppName db 'Demo 1', 0
>szHello db 'Hello, '
>szUser db MAX_USER_NAME dup (0)
>CodeSeg
>Start: call GetModuleHandleA, 0
> call DialogBoxParamA, eax, IDD_DIALOG, 0, offset DlgProc, 0
> cmp eax,IDOK
> jne bye
> call MessageBoxA, 0, offset szHello, \
> offset szAppName, \
> MB_OK or MB_ICONINFORMATION
>bye: call ExitProcess, 0
>public stdcall DlgProc
>proc DlgProc stdcall
>arg @@hDlg :dword, @@iMsg :dword, @@wPar :dword, @@lPar :dword
> mov eax,[@@iMsg]
> cmp eax,WM_INITDIALOG
> je @@init
> cmp eax,WM_COMMAND
> jne @@ret_false
> mov eax,[@@wPar]
> cmp eax,IDCANCEL
> je @@cancel
> cmp eax,IDOK
> jne @@ret_false
> call GetDlgItemTextA, @@hDlg, IDR_NAME, \
> offset szUser, MAX_USER_NAME