Win32汇编学习笔记(二)

本文提供了一个使用Win32 API的汇编语言程序示例,该程序展示如何创建一个带有按钮的基本窗口,并在按钮被点击时弹出对话框显示信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模仿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
moveax,uMsg
None.gif
;********************************************************************
None.gif
.ifeax==WM_CREATE
None.gifinvokeCreateWindowEx,NULL,offsetszButton,offsetszButtonText,/
None.gifWS_CHILD
orWS_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
orDT_CENTERorDT_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
xoreax,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
movhInstance,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
pushhInstance
None.gif
pop@stWndClass.hInstance
None.gif
mov@stWndClass.cbSize,sizeofWNDCLASSEX
None.gif
mov@stWndClass.style,CS_HREDRAWorCS_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
movhWinMain,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、付费专栏及课程。

余额充值