-
كد فوق ساده است واحتياجي به توضيح ندارد.اين فايل را همانطوري كه قبلاً توضيح دادم assemble و link كنيد.پس از پايان كار يه نگاهي به حجم فايل exe ايجاد شده بيندازيد...حتماً تعجب خواهيد كرد!!!
پنجره اي رو به آفتاب!!
شايد وقتش شده باشه كه با هم يك پنجره بسازيم!!!
در مورد كد زير فكر ميكنم توضيحات درون خود كد كافي باشد اما متذكر ميشوم كه اگر نحوه ساختن يك پنجره بوسيله Win32 API را نميدانيد ممكن است كد زير كمي براي شما پيچيده باشد (براي اطلاعات بيشتر به كتاب Programming Windows نوشته Charles Petzoldمراجعه كنيد.)
.386
.model flat, stdcall
option casemap:none
include \masm32\include\WINDOWS.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.DATA ; initialized data
ClassName db "SimpleWinClass",0 ; the name of our window class
AppName db "Our First Window",0 ; the name of our window
;-------------------------------------------------------------------
.DATA? ; Uninitialized data
hInstance HINSTANCE ? ; Instance handle of our program
CommandLine LPSTR ?
;-------------------------------------------------------------------
.CODE ; Here begins the code
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShowWORD
; creating local variables on stack
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX ; fill values in members of wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; register our window class
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; display our window on desktop
invoke UpdateWindow, hwnd ; refresh the client area
; Enter message loop
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; return exit code in eax
ret
WinMain endp
;----------------------------------------------------------------------
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY ;if the user closes our window
invoke PostQuitMessage,NULL ; quit
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ;Default message processing
ret
.ENDIF
xor eax,eax
ret
WndProc endp
;-----------------------------------------------------------------------
start:
invoke GetModuleHandle, NULL ;get the instance handle of our program.
mov hInstance,eax
invoke GetCommandLine ; get the command line. You don't have to call this
; function IF your program doesn't process the command line.
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT ;call the main ;function
invoke ExitProcess, eax ;quit our program. The exit code is returned in eax ;from WinMain.
end start
نتيجه برنامه را در شكل زير مشاهده ميكنيد:
آيا فكر ميكنيد اين برنامه هيچكاري جز نمايش يك پنجره خالي انجام نميدهد؟
نكته: در كد فوق از عملگرد جديد MASM با نام ADDR استفاده شده است .اين عملگرآدرس effective يك متغييررا محاسبه ميكند ولي مشكل آن اينست كه تنها به همراه invoke قابل استفاده است ،پس در حالات ديگرنميتوانيد ADDR را بكار بريدو بايد از همان دستور LEA استفاده كنيد.
برچسب برای این موضوع
مجوز های ارسال و ویرایش
- شما نمی توانید موضوع جدید ارسال کنید
- شما نمی توانید به پست ها پاسخ دهید
- شما strong>نمی توانید فایل پیوست ضمیمه کنید
- شما نمی توانید پست های خود را ویرایش کنید
-
قوانین انجمن