Win32汇编学习笔记(二)

模仿win32Hello,World程序:

None.gif . 386
None.gif.modelflat,stdcall
None.gifoption
casemap: none
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
Include文件定义
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
includewindows. inc
None.gifincludegdi32.
inc
None.gifincludelibgdi32.lib
None.gifincludeuser32.
inc
None.gifincludelibuser32.lib
None.gifincludekernel32.
inc
None.gifincludelibkernel32.lib
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
数据段
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
.data?
None.gifhInstancedd?
; 应用程序句柄
None.gif
hWinMaindd? ; 窗口句柄
None.gif

None.gif.const
None.gifszClassNamedb
' MyClass ' , 0 ; 窗口类名称
None.gif
szCaptionMaindb ' MyfirstWindow! ' , 0 ; 窗口标题
None.gif
szTextdb ' Hello,Win32Assembly!! ' , 0 ; 要显示的信息
None.gif
szButtondb ' button ' , 0
None.gifszButtonTextdb
' 点我吧!! ' , 0
None.gifszMsgTitledb
' 信息 ' , 0
None.gifszErrorMsgdb
' 出错啦!! ' , 0
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
代码段
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
.code
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
出错处理过程
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
_ErrorProcproc
None.gifinvokeMessageBox,NULL,offsetszErrorMsg,offsetszMsgTitle,MB_OK
None.gif
ret
None.gif_ErrorProcendp
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
窗口过程
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
_ProcWinMainprocusesebxediesihWnd,uMsg,wParam,lParam ; 让汇编器保持子程序中使用到的寄存器的正确性
None.gif
local @stPs: PAINTSTRUCT
None.giflocal
@stRect: RECT
None.giflocal@hDc
None.gif
None.gif
mov eax,uMsg
None.gif
; ********************************************************************
None.gif
.ifeax==WM_CREATE
None.gifinvokeCreateWindowEx,NULL,offsetszButton,offsetszButtonText,/
None.gifWS_CHILD
or WS_VISIBLE, 100 , 100 , 65 , 50 ,hWnd, 1 ,hInstance,NULL
None.gif
; ********************************************************************
None.gif
.elseifeax==WM_PAINT
None.gifinvokeBeginPaint,hWnd,addr@stPs
None.gif
mov @hDc,eax
None.gif
None.gifinvokeGetClientRect,hWnd,addr@stRect
None.gifinvokeDrawText,@hDc,addrszText,-
1 ,/ ; 长度设置为-1,表示输出的字符串以'/0'结尾,且由函数自动计算出其长度
None.gif
addr@stRect,/
None.gifDT_SINGLELINE
or DT_CENTER or DT_VCENTER
None.gif
None.gifinvokeEndPaint,hWnd,addr@stPs
None.gif
; ********************************************************************
None.gif
.elseifeax==WM_COMMAND
None.gifinvokeMessageBox,NULL,offsetszText,offsetszMsgTitle,MB_OK
None.gif
; ********************************************************************
None.gif
.elseifeax==WM_CLOSE
None.gifinvokeDestroyWindow,hWinMain
None.gifinvokePostQuitMessage,NULL
None.gif
; ********************************************************************
None.gif
.else
None.gifinvokeDefWindowProc,hWnd,uMsg,wParam,lParam
None.gif
ret
None.gif.endif
None.gif
; ********************************************************************
None.gif
xor eax,eax ; eax寄存器清零
None.gif
ret
None.gif
None.gif_ProcWinMainendp
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
WinMain函数
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif

None.gif_WinMainproc
None.giflocal
@stWndClass: WNDCLASSEX
None.giflocal
@stMsg: MSG
None.gif
None.gifinvokeGetModuleHandle,NULL
; 获取应用程序句柄,这在VC里是通过操作系统传递进来的,但是汇编中需要自己去获取
None.gif
mov hInstance,eax ; 获取到的应用程序句柄在eax中
None.gif
invokeRtlZeroMemory,addr@stWndClass,sizeof@stWndClass ; 清零
None.gif;
********************************************************************
None.gif;
注册窗口类
None.gif;
********************************************************************
None.gif
invokeLoadCursor, 0 ,IDC_ARROW ; 加载光标
None.gif
mov @stWndClass.hCursor,eax
None.gif
push hInstance
None.gif
pop @stWndClass.hInstance
None.gif
mov @stWndClass.cbSize,sizeofWNDCLASSEX
None.gif
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
None.gif
None.gif
mov @stWndClass.lpfnWndProc,offset_ProcWinMain ; 设置窗口处理函数
None.gif
; invokeGetStockObject,WHITE_BRUSH
None.gif
; mov@stWndClass.hbrBackground,eax
None.gif
mov @stWndClass.hbrBackground,COLOR_WINDOW+ 1
None.gif
mov @stWndClass.lpszClassName,offsetszClassName
None.gifinvokeRegisterClassEx,addr@stWndClass
; 注册窗口类
None.gif;
********************************************************************
None.gif;
建立并显示窗口
None.gif;
********************************************************************
None.gif
invokeCreateWindowEx,WS_EX_CLIENTEDGE,offsetszClassName,offsetszCaptionMain,/
None.gifWS_OVERLAPPEDWINDOW,/
None.gif
100 , 100 , 600 , 400 ,/
None.gifNULL,NULL,hInstance,NULL
; 创建窗口,发出一个WM_CREATE消息
None.gif
mov hWinMain,eax ; 保存窗口句柄
None.gif
invokeShowWindow,hWinMain,SW_SHOWNORMAL ; 显示窗口
None.gif
invokeUpdateWindow,hWinMain ; 发出一个WM_PAINT消息
None.gif;
********************************************************************
None.gif;
第一种消息循环,使用GetMessage,同步的
None.gif;
********************************************************************
None.gif
; .whileTRUE
None.gif
; invokeGetMessage,addr@stMsg,NULL,0,0
None.gif
; .break.ifeax==0;stMsg为0,即收到WM_QUIT消息时退出
None.gif
; invokeTranslateMessage,addr@stMsg
None.gif
; invokeDispatchMessage,addr@stMsg
None.gif
; .endw
None.gif;
********************************************************************
None.gif;
另一种消息循环,使用PeekMessage,异步的
None.gif;
********************************************************************
None.gif
.whileTRUE
None.gifinvokePeekMessage,addr@stMsg,NULL,
0 , 0 ,PM_REMOVE
None.gif.ifeax!=
0
None.gif.break.if@stMsg.message==WM_QUIT
None.gifinvokeTranslateMessage,addr@stMsg
None.gifinvokeDispatchMessage,addr@stMsg
None.gif.else
None.gif
; 空闲时间,可以做其他处理工作
None.gif
.endif
None.gif.endw
None.gif
ret
None.gif_WinMainendp
None.gif
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif;
程序入口点
None.gif;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
start:
None.gif
call _WinMain
None.gifinvokeExitProcess,NULL
None.gif
; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
None.gif
endstart
None.gif
None.gif
None.gif

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

运行结果:


2008030702.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值