win32汇编窗口程序源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.386
.model flat,stdcall
option casemap:none

include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

.data?
hInstance dd ?
hWinMain dd ?

.const
szClassName db "MyClass",0
szCaptionMain db "My first windows!",0
szText db "Welcome to ",0

.code
;在窗口过程,ebx,edi,esi,ebp这四个寄存器在Windows内部被作为指针使用,因此在程序中要保护这四个寄存器
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam;加入user ebx edi esi后,会通过push,pop指令来保护这些寄存器,
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc

mov eax,uMsg
.if eax==WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax ;汇编中,所有的返回值都默认放在eax中的。

invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER

invoke EndPaint,hWnd,addr @stPs
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWinMain
; invoke PostQuitMessage,NULL

.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
; xor eax,eax
ret
_ProcWinMain endp


_WinMain proc
local @stWndClass:WNDCLASSEX;在windows.inc这个包含文件中
local @stMsg:MSG

invoke GetModuleHandle,NULL;获得模块的句柄,一般模块的地址是这个模块在内存中的地址
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass

;注册窗口类
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance;注意这种拷贝的方法,以后会见到的
pop @stWndClass.hInstance;为什么不直接用MOV的方法呢?MOV不能直接对两个存储空间进行操作,如果要操作的话,必须借助于一个寄存器。
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName;给这个对象化的类命名,MyClass
invoke RegisterClassEx,addr @stWndClass

;建立并显示窗口
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax;CreateWindowEx在调用后,eax中会传来建立的窗口的句柄。
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain


.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0;接收信息,信息放到stMsg结构中
.break .if eax==0
invoke TranslateMessage,addr @stMsg;将键盘的扫描码,转换成ASCII码
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp


start:
call _WinMain
invoke ExitProcess,NULL
end start

相关文档
最新文档