Создание диалогового окна на ассемблере в 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 model
option casemap :none ; case sensitive
include \masm32\include\dialogs.inc
include first.inc
dlgproc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
mov hInstance, FUNC(GetModuleHandle,NULL)
call main
invoke ExitProcess,eax
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
main proc
Dialog "Любимый ассемблер","MS Sans Serif",10, \ ; caption,font,pointsize
WS_OVERLAPPED or WS_SYSMENU or DS_CENTER, \ ; style
2, \ ; control count
50,50,150,80, \ ; x y co-ordinates
1024 ; memory buffer size
DlgButton "&OK",WS_TABSTOP,48,40,50,15,IDCANCEL
DlgStatic "Моя первая программа на ассемблере",SS_CENTER,2,20,140,9,100
CallModalDialog hInstance,0,dlgproc,NULL
ret
main endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.if uMsg == WM_INITDIALOG
invoke SendMessage,hWin,WM_SETICON,1,FUNC(LoadIcon,NULL,IDI_ASTERISK)
.elseif uMsg == WM_COMMAND
.if wParam == IDCANCEL
jmp quit_dialog
.endif
.elseif uMsg == WM_CLOSE
quit_dialog:
invoke EndDialog,hWin,0
.endif
xor eax, eax
ret
dlgproc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start
Сохраните код в файл под любым именем с расширением .asm в созданную папку. Я сохранил под именем first.asm. Удалите код из интегрированной среды разработки. Вставьте новый код:
; #########################################################################
; include files
; ~~~~~~~~~~~~~
include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
; libraries
; ~~~~~~~~~
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\oleaut32.lib
; #########################################################################
;=============
; Local macros
;=============
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2
push M2
pop M1
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
stralloc MACRO ln
invoke SysAllocStringByteLen,0,ln
ENDM
strfree MACRO strhandle
invoke SysFreeString,strhandle
ENDM
QUAD MACRO name,value
.data
name QWORD value
.code
ENDM
; --------------------------------------------------
; Macro for placing an assembler instruction either within another or within a procedure call
; --------------------------------------------------
ASM MACRO parameter1,source
LOCAL mnemonic
LOCAL dest
LOCAL poz
% poz INSTR 1,,< > ;; get the space position
mnemonic SUBSTR , 1, poz-1 ;; get the mnemonic
dest SUBSTR , poz+1 ;; get the first argument
mnemonic dest, source
EXITM
ENDM
; ------------------------------------------------------------
; Macro for nesting function calls in other invoke statements
; ------------------------------------------------------------
FUNC MACRO parameters:VARARG
invoke parameters
EXITM
ENDM
; -----------------------------------------------------
; Macros for declaring named floating point variables
; -----------------------------------------------------
FLOAT4 MACRO name,value
.data
name REAL4 value
.code
ENDM
FLOAT8 MACRO name,value
.data
name REAL8 value
.code
ENDM
FLOAT10 MACRO name,value
.data
name REAL10 value
.code
ENDM
; -----------------------------------------------------
; Macros for directly inserting floating point values into floating point instructions and as parameters
; -----------------------------------------------------
FP4 MACRO value
LOCAL vname
.data
vname REAL4 value
.code
EXITM
ENDM
FP8 MACRO value
LOCAL vname
.data
vname REAL8 value
.code
EXITM
ENDM
FP10 MACRO value
LOCAL vname
.data
vname REAL10 value
.code
EXITM
ENDM
; -------------------------
; initialised GLOBAL value
; -------------------------
IGLOBAL MACRO variable:VARARG
.data
variable
.code
ENDM
; --------------------------------
; initialised GLOBAL string value
; --------------------------------
STRING MACRO variable:REQ,args:VARARG
.data
variable db args,0
.code
ENDM
; ---------------------
; literal string MACRO
; ---------------------
literal MACRO quoted_text:VARARG
LOCAL local_text
.data
local_text db quoted_text,0
.code
EXITM
ENDM
; --------------------------------
; string address in INVOKE format
; --------------------------------
SADD MACRO quoted_text:VARARG
EXITM
ENDM
; --------------------------------
; string OFFSET for manual coding
; --------------------------------
CTXT MACRO quoted_text:VARARG
EXITM
ENDM
ShellAboutBox MACRO handle,IconHandle,quoted_Text_1,quoted_Text_2:VARARG
LOCAL AboutTitle,AboutMsg,buffer
.data
AboutTitle db quoted_Text_1,0
AboutMsg db quoted_Text_2,0
buffer db 128 dup (0)
.code
mov esi, offset AboutTitle
mov edi, offset buffer
mov ecx, lengthof AboutTitle
rep movsb
invoke ShellAbout,handle,ADDR buffer,ADDR AboutMsg,IconHandle
ENDM
AppModel MACRO Processor
Processor ;; Processor type
.model flat, stdcall ;; 32 bit memory model
option casemap :none ;; case sensitive
ENDM
DisplayMenu MACRO handl, IDnum
invoke LoadMenu,hInstance,IDnum
invoke SetMenu,handl,eax
ENDM
DisplayWindow MACRO handl, ShowStyle
invoke ShowWindow,handl, ShowStyle
invoke UpdateWindow,handl
ENDM
AutoScale MACRO swidth, sheight
invoke GetPercent,sWid,swidth
mov Wwd, eax
invoke GetPercent,sHgt,sheight
mov Wht, eax
invoke TopXY,Wwd,sWid
mov Wtx, eax
invoke TopXY,Wht,sHgt
mov Wty, eax
ENDM
SingleInstanceOnly MACRO lpClassName
invoke FindWindow,lpClassName,NULL
cmp eax, 0
je @F
push eax
invoke ShowWindow,eax,SW_RESTORE
pop eax
invoke SetForegroundWindow,eax
mov eax, 0
ret
@@:
ENDM
GLOBAL MACRO var1,var2,var3,var4,var5,var6,var7,var8,var9,var0,
varA,varB,varC,varD,varE,varF,varG,varH,varI,varJ
.data?
.code
ENDM
.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 килобайта.
Страница обновлена 31 марта 2024 года.