;Win32汇编-----Hello,World!
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCaption db 'A MessageBox !',0
szText db 'Hello,World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke MessageBox,NULL,offset szText,\
offset szCaption,MB_OK
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
;Win32汇编编程----窗口建立范例
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
Hinstance dd ?
HwinMain dd ?
.const
lpszClassName db 'classname',0
lpWindowName db '永恒',0
lpstring db '太阳帝国万岁!!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;回调函数,窗口过程是给windows回调用的。
wndproc proc uses ebx edi esi,hwnd,msg,wparam,lparam ;要注意,窗口过程中要注意保存ebx,edi,esi和ebp寄存器,高级语言中不用操心着一点。
local ps:PAINTSTRUCT ;在所有阶段的消息中,大部分的消息都不需要程序自己关心。windows只是尽义务通知窗口而已local hdc ;窗口过程转手就交给DefWindowProc去处理了。程序需要关心的只有下面这些:
local rect1:RECT ;WN_CREATE(放置窗口初始化代码,如建立个种子窗口状态栏工具栏),WM_SIZE(放置位置安 ;排的代码)WM_PAINT(如果需要自己绘制客户区,则在这里安排代码。)WM_CLOSE(向用户
;确认是否退出,如果退出则摧毁窗口并发送WM_QUIT消息)WM_DESTROY(窗口1摧毁)
mov eax,msg
;*************************************************************************
.if eax == WM_PAINT
invoke BeginPaint,hwnd,addr ps
mov hdc,eax
invoke GetClientRect,hwnd,addr rect1
invoke DrawText,hdc,offset lpstring,-1,addr rect1,DT_CENTER or DT_LEFT
invoke EndPaint,hwnd,addr ps
;*************************************************************************
.elseif eax == WM_CLOSE
invoke DestroyWindow,hwnd
invoke PostQuitMessage,NULL
;*************************************************************************
.else
invoke DefWindowProc,hwnd,msg,wparam,lparam
ret
.endif
;************************************************************************
xor eax,eax
ret
wndproc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc
local @wndclass:WNDCLASS
local @stmsg:MSG
invoke GetModuleHandle,NULL ;取模块句柄API,使用参数NULL调用该句柄得到的是调用者本模块的句柄
mov Hinstance,eax ;Hinstance是实例。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;WNDCLASS 结构,注册窗口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;程序定义了一个WNDCLASSEX变量@stWndClass,用RtlZeroMemory将它填为全零
invoke RtlZeroMemory,addr @wndclass,sizeof WNDCLASS ;再填写结构的各个字段,这样,没有赋值的部分就保持为零
mov @wndclass.style,CS_VREDRAW or CS_HREDRAW ;CS_VREDRAW 和 CS_HREDRAW表示窗口的高度或宽度改变时是否重画窗口
mov @wndclass.lpfnWndProc,offset wndproc ;最重要的参数,它指定了基于这个类建立窗口的窗口过程地址,通过这个参数
;windows就知道了在DispatchMessage函数里把窗口消息发到哪去,一个窗口过程
;可以为多个窗口服务,只要这些窗口是基于同一个 窗口类建立的。
push Hinstance ;指定要注册窗口属于哪个模块,模块句柄在程序开始的地方,已经用GetModuleHandle函数 ;获得
pop @wndclass.hInstance
invoke LoadIcon,0,IDI_ERROR ;windows已经预定义了一些图标同样程序可以使用在资源文件中定义的一些图标
;图标,这些图标可以用LoadIcon函数获得
mov @wndclass.hIcon,eax ;图标句柄
invoke LoadCursor,0,IDC_HELP ;LoadCursor获取光标句柄
mov @wndclass.hbrBackground,COLOR_WINDOW+1 ;窗口客户区的背景色
mov @wndclass.lpszClassName,offset lpszClassName ;lpszMenuName指定窗口上显示的默认菜单。窗口中的菜单也可以在CreateWindowEx的参 ;数中指定
invoke RegisterClass,addr @wndclass
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;创建窗口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,offset lpszClassName,offset lpWindowName, WS_OVERLAPPEDWINDOW,\
100,100,500,500,NULL,NULL,offset Hinstance,NULL
;CreateWindowEx函数使用方法是:
; invoke CreateWindowEx,dwExstyle,lpClassName,lpWindowName,\
;dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,IpParam
;1,lpClassName,建立窗口使用的类名字符串指针。
;2,lpWindowName,指向表示窗口名称的字符串。
;3,hMenu窗口上要出现的菜单的句柄
;4,lpParam,这是一个指针,指向一个欲传给窗口的参数,这个参数在
;WM_CREATE消息中被获取,一般情况下用不到这个字段。
;5,hInstance,模块句柄,和注册窗口类时一样,指定了窗口所属的程序模块。
;6,hWndParent窗口所属的父窗口。
;7,x,y指定窗口左上角的位置,单位是像素。
;8,nWidth,nHeight窗口的宽度和高度。即窗口的大小。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示更新窗口
mov HwinMain,eax
invoke ShowWindow,HwinMain,SW_SHOWDEFAULT
invoke UpdateWindow,HwinMain
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 消息循环
.while TRUE
invoke GetMessage,addr @stmsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stmsg
invoke DispatchMessage,addr @stmsg
.endw
ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start : ;程序入口
call WinMain ;执行winmain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
附WNDCLASSEX结构 :
WNDCLASSEX STRUCT
cbsize DWORD ? ;结构的字节数
style DWORD ? ;类风格
lpfnwndproc DWORD ? ;窗口过程的地址
cbclsextra DWORD ?
cbwndextra DWORD ?
hinstance DWORD ? ;所属的实例句柄
hicon DWORD ? ;窗口图标
hcursor DWORD ? ;窗口光标
hbrbackground DWORD ? ;背景色
lpszmenuname DWORD ? ;窗口菜单
lpszclassname DWORD ? ;类名字符串的地址
hiconsm DWORD ? ;小图标
WNDCLSSEX
;CreateWindowEx函数使用方法是:
; invoke CreateWindowEx,dwExstyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,IpParam
;1,lpClassName,建立窗口使用的类名字符串指针。
;2,lpWindowName,指向表示窗口名称的字符串。
;3,hMenu窗口上要出现的菜单的句柄
;4,lpParam,这是一个指针,指向一个欲传给窗口的参数,这个参数在WM_CREATE消息中被获取,一般情况下用不到这个字段。
;5,hInstance,模块句柄,和注册窗口类时一样,指定了窗口所属的程序模块。
;6,hWndParent窗口所属的父窗口。
;7,x,y指定窗口左上角的位置,单位是像素。
;8,nWidth,nHeight窗口的宽度和高度。即窗口的大小。
CreateWindowEx也可以用来建立子窗口,Windows中有许多预定义的子窗口类,如按钮和文本框的类名分别是“Button”和“Edit”。要建立一个按钮只需把lpClassName指向Button
字符串就可以了。
.data
szButton db 'button',0
szButtonText db '&Ok',0
...
invoke CreateWindowEx,NULL,\
offset szButton,offset szButtonText,\
WS_CHILD or WS_VISIBLE,\
10,10,65,22,\
hWnd,1,hInstance,NULL
消息循环中的几个函数要用到一个MSG结构,用来做消息传递
MSG STRUCT
hwnd DWORD ?
message DWORD ?
wParam DWORD ?
lParam DWORD ?
time DWORD ?
pt POINT <>
MSG ENDS
hwnd,消息要发向的窗口句柄
message,消息标识符,在头文件中以WM_开头的预定义值
wParam,消息的参数之一
lParam,消息的参数之二
time,消息放入消息队列的时间
pt,这是一个POINT数据结构,表示消息放入消息队列时鼠标坐标
这个结构定义了消息的所有属性,GetMessage函数就是从消息队列中取出这样一条消息的:
invoke Getmessage1pMsg,hwnd,wMsgFilterMin,wMsgFilterMax
hWnd参数指定要获取哪个窗口,NULL表示获取本程序所属窗口的消息。wMsgFilterMin,wMsgFilterMax为0表示获取所有编号的消息。
窗口过程:
窗口过程是给windows回调用的。
窗口过程的子程序的参数格式为:
WindowProc proc hwnd,uMsg,wParam,lParam gvbf