Создание диалогового окна на ассемблере в MASM32
Степень завершённости урока: 50%
Скачайте с сайта http://www.masm32.com/download.htm MASM32 SDK (интегрированная среда разработки входит в комплект). Установите MASM32 в корень системного диска (обычно С://). После установки MASM32 перейдите в папку "C://masm32". Откройте файл qeditor.exe (интегрированная среда разработки MASM32).
Так выглядит окно MASM32 сразу после запуска.
Создайте папку с произвольным именем. Наберите следующий код в интегрированной среде разработки MASM32:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««.486 ; create 32 bit code.model flat, stdcall ; 32 bit memory modeloption casemap :none ; case sensitiveinclude \masm32\include\dialogs.incinclude first.incdlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD.code; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««start:mov hInstance, FUNC(GetModuleHandle,NULL)call maininvoke ExitProcess,eax; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««main procDialog "Любимый ассемблер","MS Sans Serif",10, \ ; caption,font,pointsizeWS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \ ; style2, \ ; control count50,50,150,80, \ ; x y co-ordinates1024 ; memory buffer sizeDlgButton "&OK",WS_TABSTOP,48,40,50,15,IDCANCELDlgStatic "Моя первая программа на ассемблере",SS_CENTER,2,20,140,9,100CallModalDialog hInstance,0,dlgproc,NULLretmain endp; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD.if uMsg == WM_INITDIALOGinvoke SendMessage,hWin,WM_SETICON,1,FUNC(LoadIcon,NULL,IDI_ASTERISK).elseif uMsg == WM_COMMAND.if wParam == IDCANCELjmp quit_dialog.endif.elseif uMsg == WM_CLOSEquit_dialog:invoke EndDialog,hWin,0.endifxor eax, eaxretdlgproc endp; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««end startСохраните код в файл под любым именем с расширением .asm в созданную папку. Я сохранил под именем first.asm. Удалите код из интегрированной среды разработки. Вставьте новый код:; #########################################################################; include files; ~~~~~~~~~~~~~include \masm32\include\windows.incinclude \masm32\include\masm32.incinclude \masm32\include\gdi32.incinclude \masm32\include\user32.incinclude \masm32\include\kernel32.incinclude \masm32\include\Comctl32.incinclude \masm32\include\comdlg32.incinclude \masm32\include\shell32.incinclude \masm32\include\oleaut32.inc; libraries; ~~~~~~~~~includelib \masm32\lib\masm32.libincludelib \masm32\lib\gdi32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\Comctl32.libincludelib \masm32\lib\comdlg32.libincludelib \masm32\lib\shell32.libincludelib \masm32\lib\oleaut32.lib; #########################################################################;=============; Local macros;=============szText MACRO Name, Text:VARARGLOCAL lbljmp lblName db Text,0lbl:ENDMm2m MACRO M1, M2push M2pop M1ENDMreturn MACRO argmov eax, argretENDMstralloc MACRO lninvoke SysAllocStringByteLen,0,lnENDMstrfree MACRO strhandleinvoke SysFreeString,strhandleENDMQUAD MACRO name,value.dataname QWORD value.codeENDM; --------------------------------------------------; Macro for placing an assembler instruction either within another or within a procedure call; --------------------------------------------------ASM MACRO parameter1,sourceLOCAL mnemonicLOCAL destLOCAL poz% poz INSTR 1,,< > ;; get the space positionmnemonic SUBSTR , 1, poz-1 ;; get the mnemonicdest SUBSTR , poz+1 ;; get the first argumentmnemonic dest, sourceEXITMENDM; ------------------------------------------------------------; Macro for nesting function calls in other invoke statements; ------------------------------------------------------------FUNC MACRO parameters:VARARGinvoke parametersEXITMENDM; -----------------------------------------------------; Macros for declaring named floating point variables; -----------------------------------------------------FLOAT4 MACRO name,value.dataname REAL4 value.codeENDMFLOAT8 MACRO name,value.dataname REAL8 value.codeENDMFLOAT10 MACRO name,value.dataname REAL10 value.codeENDM; -----------------------------------------------------; Macros for directly inserting floating point values into floating point instructions and as parameters; -----------------------------------------------------FP4 MACRO valueLOCAL vname.datavname REAL4 value.codeEXITMENDMFP8 MACRO valueLOCAL vname.datavname REAL8 value.codeEXITMENDMFP10 MACRO valueLOCAL vname.datavname REAL10 value.codeEXITMENDM; -------------------------; initialised GLOBAL value; -------------------------IGLOBAL MACRO variable:VARARG.datavariable.codeENDM; --------------------------------; initialised GLOBAL string value; --------------------------------STRING MACRO variable:REQ,args:VARARG.datavariable db args,0.codeENDM; ---------------------; literal string MACRO; ---------------------literal MACRO quoted_text:VARARGLOCAL local_text.datalocal_text db quoted_text,0.codeEXITMENDM; --------------------------------; string address in INVOKE format; --------------------------------SADD MACRO quoted_text:VARARGEXITMENDM; --------------------------------; string OFFSET for manual coding; --------------------------------CTXT MACRO quoted_text:VARARGEXITMENDMShellAboutBox MACRO handle,IconHandle,quoted_Text_1,quoted_Text_2:VARARGLOCAL AboutTitle,AboutMsg,buffer.dataAboutTitle db quoted_Text_1,0AboutMsg db quoted_Text_2,0buffer db 128 dup(0).codemov esi, offset AboutTitlemov edi, offset buffermov ecx, lengthof AboutTitlerep movsbinvoke ShellAbout,handle,ADDR buffer,ADDR AboutMsg,IconHandleENDMAppModel MACRO ProcessorProcessor ;; Processor type.model flat, stdcall ;; 32 bit memory modeloption casemap :none ;; case sensitiveENDMDisplayMenu MACRO handl, IDnuminvoke LoadMenu,hInstance,IDnuminvoke SetMenu,handl,eaxENDMDisplayWindow MACRO handl, ShowStyleinvoke ShowWindow,handl, ShowStyleinvoke UpdateWindow,handlENDMAutoScale MACRO swidth, sheightinvoke GetPercent,sWid,swidthmov Wwd, eaxinvoke GetPercent,sHgt,sheightmov Wht, eaxinvoke TopXY,Wwd,sWidmov Wtx, eaxinvoke TopXY,Wht,sHgtmov Wty, eaxENDMSingleInstanceOnly MACRO lpClassNameinvoke FindWindow,lpClassName,NULLcmp eax, 0je @Fpush eaxinvoke ShowWindow,eax,SW_RESTOREpop eaxinvoke SetForegroundWindow,eaxmov eax, 0ret@@:ENDMGLOBAL MACRO var1,var2,var3,var4,var5,var6,var7,var8,var9,var0,varA,varB,varC,varD,varE,varF,varG,varH,varI,varJ.data?.codeENDM.data?hInstance dd ?
Сохраните код в файл с расширением .inc. Обратите внимание, что у вас в папке должны находиться два файла - с расширением .asm и расширением .inc. ВАЖНО. В строчке 6 файла с расширением .asm написан код:
include first.inc
...замените first на название вашего файла с расширением .inc. Т.е. если у вас два файла называются demo.asm и demo.inc, то строчку...
include first.inc
...в файле demo.asm необходимо заменить на...
include demo.inc
Откройте в интегрированной среде разработки MASM32 любой из двух файлов. В меню "Project" выберите пункт "Build All".
Если всё сделано правильно, вы увидите сообщение об успешной компиляции программы (в папке с вашими файлами появится исполняемый файл с расширением .exe).
Запустите вашу программу. Обратите внимание, что она занимает всего 2,5 килобайта.
Страница обновлена 1 марта 2026 года.


