Win32汇编学习笔记(四)

前面几篇文章中都没有使用到菜单,对话框等资源,这次就演练如何在应用程序中加入这些资源。我们就以将VC6.0默认生成的Win32程序移植为32位汇编为例。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

首先用VC6.0生成一个默认Win32版的Hello,World程序,将Hello.rcdemo.ico,small.ico都拷贝到项目目录下,去掉VC6.0相关的部分,最后Hello.rc修改如下:

Win32汇编学习笔记(四)//MicrosoftVisualC++generatedresourcescript.
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)#include"resource.h"
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)#defineIDR_MAINFRAME128
Win32汇编学习笔记(四)#defineIDD_DEMO_DIALOG102
Win32汇编学习笔记(四)#defineIDD_ABOUTBOX103
Win32汇编学习笔记(四)#defineIDS_APP_TITLE103
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)#defineIDM_ABOUT104
Win32汇编学习笔记(四)#defineIDM_EXIT105
Win32汇编学习笔记(四)#defineIDS_HELLO106
Win32汇编学习笔记(四)#defineIDI_DEMO107
Win32汇编学习笔记(四)#defineIDI_SMALL108
Win32汇编学习笔记(四)#defineIDC_DEMO109
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)#defineIDC_MYICON2
Win32汇编学习笔记(四)#defineIDC_STATIC-1
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//Icon
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//IconwithlowestIDvalueplacedfirsttoensureapplicationicon
Win32汇编学习笔记(四)//remainsconsistentonallsystems.
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)IDI_DEMOICONDISCARDABLE"demo.ICO"
Win32汇编学习笔记(四)IDI_SMALLICONDISCARDABLE"SMALL.ICO"
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//Menu
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)IDC_DEMOMENUDISCARDABLE
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)POPUP"
&File"
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)MENUITEM"E
&xit",IDM_EXIT
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)POPUP"
&Help"
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)MENUITEM"
&AboutWin32汇编学习笔记(四)",IDM_ABOUT
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//Accelerator
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)IDC_DEMOACCELERATORSMOVEABLEPURE
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)"?",IDM_ABOUT,ASCII,ALT
Win32汇编学习笔记(四)"/",IDM_ABOUT,ASCII,ALT
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//Dialog
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)IDD_ABOUTBOXDIALOGDISCARDABLE22,17,230,75
Win32汇编学习笔记(四)STYLEDS_MODALFRAME|WS_CAPTION|WS_SYSMENU
Win32汇编学习笔记(四)CAPTION"About"
Win32汇编学习笔记(四)FONT8,"System"
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)ICONIDI_DEMO,IDC_MYICON,14,9,16,16
Win32汇编学习笔记(四)LTEXT"HelloApp1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
Win32汇编学习笔记(四)LTEXT"Copyright(C)2008",IDC_STATIC,49,20,119,8
Win32汇编学习笔记(四)DEFPUSHBUTTON"OK",IDOK,195,6,30,11,WS_GROUP
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)//StringTable
Win32汇编学习笔记(四)//
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)STRINGTABLEDISCARDABLE
Win32汇编学习笔记(四)BEGIN
Win32汇编学习笔记(四)IDC_DEMO"DEMO"
Win32汇编学习笔记(四)IDS_APP_TITLE"demo"
Win32汇编学习笔记(四)IDS_HELLO"HelloWorld!"
Win32汇编学习笔记(四)END
Win32汇编学习笔记(四)/////////////////////////////////////////////////////////////////////////////
Win32汇编学习笔记(四)

然后创建一个MakFile文件,内容如下:

Win32汇编学习笔记(四)NAME=Hello
Win32汇编学习笔记(四)OBJS
=$(NAME).obj
Win32汇编学习笔记(四)RES
=$(NAME).res
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
$(NAME).exe:$(OBJS)$(RES)
Win32汇编学习笔记(四)Link
/SUBSYSTEM:WINDOWS$(OBJS)$(RES)
Win32汇编学习笔记(四)
$(RES):$(NAME).rc
Win32汇编学习笔记(四)rc
$(NAME).rc
Win32汇编学习笔记(四)
.asm.obj:
Win32汇编学习笔记(四)ml
/c/coff$(NAME).asm
Win32汇编学习笔记(四)

最后仿照VC++代码编写汇编代码如下:

Win32汇编学习笔记(四).386
Win32汇编学习笔记(四).modelflat,stdcall
Win32汇编学习笔记(四)option
casemap:none
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
Include文件定义
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>includewindows.inc
Win32汇编学习笔记(四)
includegdi32.inc
Win32汇编学习笔记(四)includelibgdi32.lib
Win32汇编学习笔记(四)includeuser32.
inc
Win32汇编学习笔记(四)includelibuser32.lib
Win32汇编学习笔记(四)includekernel32.
inc
Win32汇编学习笔记(四)includelibkernel32.lib
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)IDR_MAINFRAMEequ
128
Win32汇编学习笔记(四)IDD_DEMO_DIALOGequ
102
Win32汇编学习笔记(四)IDD_ABOUTBOXequ
103
Win32汇编学习笔记(四)IDS_APP_TITLEequ
103
Win32汇编学习笔记(四)IDM_ABOUTequ
104
Win32汇编学习笔记(四)IDM_EXITequ
105
Win32汇编学习笔记(四)IDS_HELLOequ
106
Win32汇编学习笔记(四)IDI_DEMOequ
107
Win32汇编学习笔记(四)IDI_SMALLequ
108
Win32汇编学习笔记(四)IDC_DEMOequ
109
Win32汇编学习笔记(四)IDC_MYICONequ
2
Win32汇编学习笔记(四)IDC_STATICequ-
1
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
数据段
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)
.data?
Win32汇编学习笔记(四)hInstancedd?
;应用程序句柄
Win32汇编学习笔记(四)
hWinMaindd?;窗口句柄
Win32汇编学习笔记(四)
szCaptionMaindb1024dup(?)
Win32汇编学习笔记(四)szTextdb
1024dup(?)
Win32汇编学习笔记(四)
Win32汇编学习笔记(四).const
Win32汇编学习笔记(四)szClassNamedb
'MyClass',0;窗口类名称
Win32汇编学习笔记(四)

Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
代码段
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)
.code
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
About对话框处理函数
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)
_Aboutprocusesebxediesi,hDlg,uMsg,wParam,lParam
Win32汇编学习笔记(四)
moveax,uMsg
Win32汇编学习笔记(四).ifeax==WM_COMMAND
Win32汇编学习笔记(四)
moveax,wParam
Win32汇编学习笔记(四)
movzxeax,ax
Win32汇编学习笔记(四).ifeax==IDOK
Win32汇编学习笔记(四)invokeEndDialog,hDlg,eax
Win32汇编学习笔记(四)
;invokeMessageBox,NULL,addrszText,addrszCaptionMain,MB_OK
Win32汇编学习笔记(四)
.endif
Win32汇编学习笔记(四).elseifeax==WM_INITDIALOG
Win32汇编学习笔记(四)
moveax,1
Win32汇编学习笔记(四)
ret
Win32汇编学习笔记(四).endif
Win32汇编学习笔记(四)
xoreax,eax;这句非常重要,清零eax,相当于返回false
Win32汇编学习笔记(四)
ret
Win32汇编学习笔记(四)_Aboutendp
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
窗口过程
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)

Win32汇编学习笔记(四)_ProcWinMainprocusesebxediesihWnd,uMsg,wParam,lParam
;让汇编器保持子程序中使用到的寄存器的正确性
Win32汇编学习笔记(四)
local@stPs:PAINTSTRUCT
Win32汇编学习笔记(四)local
@stRect:RECT
Win32汇编学习笔记(四)[email protected]
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
moveax,uMsg
Win32汇编学习笔记(四)
;*************************************************************
Win32汇编学习笔记(四)
.ifeax==WM_PAINT
Win32汇编学习笔记(四)invokeBeginPaint,hWnd,[email protected]
Win32汇编学习笔记(四)
mov@hDc,eax
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)invokeGetClientRect,hWnd,[email protected]
Win32汇编学习笔记(四)invokeDrawText,@hDc,addrszText,-
1,/;长度设置为-1,表示输出的字符串以'/0'结尾,且由函数自动计算出其长度
Win32汇编学习笔记(四)
[email protected],/
Win32汇编学习笔记(四)DT_SINGLELINE
orDT_CENTERorDT_VCENTER
Win32汇编学习笔记(四)invokeEndPaint,hWnd,[email protected]
Win32汇编学习笔记(四)
;*************************************************************
Win32汇编学习笔记(四)
.elseifeax==WM_COMMAND
Win32汇编学习笔记(四)
moveax,wParam
Win32汇编学习笔记(四)
movzxeax,ax
Win32汇编学习笔记(四).ifeax==IDM_EXIT
Win32汇编学习笔记(四)invokeDestroyWindow,hWinMain
Win32汇编学习笔记(四)invokePostQuitMessage,NULL
Win32汇编学习笔记(四).elseifeax==IDM_ABOUT
Win32汇编学习笔记(四)invokeDialogBoxParam,hInstance,IDD_ABOUTBOX,hWnd,_About,NULL
Win32汇编学习笔记(四).endif
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
;*************************************************************
Win32汇编学习笔记(四)
.elseifeax==WM_CLOSE
Win32汇编学习笔记(四)invokeDestroyWindow,hWinMain
Win32汇编学习笔记(四)invokePostQuitMessage,NULL
Win32汇编学习笔记(四)
;*************************************************************
Win32汇编学习笔记(四)
.else
Win32汇编学习笔记(四)invokeDefWindowProc,hWnd,uMsg,wParam,lParam
Win32汇编学习笔记(四)
ret
Win32汇编学习笔记(四).endif
Win32汇编学习笔记(四)
;*************************************************************
Win32汇编学习笔记(四)
xoreax,eax;eax寄存器清零
Win32汇编学习笔记(四)
ret
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)_ProcWinMainendp
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
WinMain函数
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)

Win32汇编学习笔记(四)_WinMainproc
Win32汇编学习笔记(四)local
@stWndClass:WNDCLASSEX
Win32汇编学习笔记(四)local
@stMsg:MSG
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)invokeGetModuleHandle,NULL
;获取应用程序句柄,这在VC里是通过操作系统传递进来的,但是汇编中需要自己去获取
Win32汇编学习笔记(四)
movhInstance,eax;获取到的应用程序句柄在eax中
Win32汇编学习笔记(四)
invokeRtlZeroMemory,[email protected],[email protected];清零
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四);
注册窗口类
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四)
invokeLoadCursor,0,IDC_ARROW;加载光标
Win32汇编学习笔记(四)
mov@stWndClass.hCursor,eax
Win32汇编学习笔记(四)invokeLoadIcon,hInstance,offsetIDI_DEMO
Win32汇编学习笔记(四)
mov@stWndClass.hIcon,eax
Win32汇编学习笔记(四)invokeLoadString,hInstance,IDS_APP_TITLE,addrszCaptionMain,sizeofszCaptionMain
Win32汇编学习笔记(四)invokeLoadString,hInstance,IDS_HELLO,addrszText,sizeofszText
Win32汇编学习笔记(四)
pushhInstance
Win32汇编学习笔记(四)
pop@stWndClass.hInstance
Win32汇编学习笔记(四)
mov@stWndClass.cbSize,sizeofWNDCLASSEX
Win32汇编学习笔记(四)
mov@stWndClass.style,CS_HREDRAWorCS_VREDRAW
Win32汇编学习笔记(四)
Win32汇编学习笔记(四)
mov@stWndClass.lpfnWndProc,offset_ProcWinMain;设置窗口处理函数
Win32汇编学习笔记(四)
;invokeGetStockObject,WHITE_BRUSH
Win32汇编学习笔记(四)
;[email protected],eax
Win32汇编学习笔记(四)
mov@stWndClass.hbrBackground,COLOR_WINDOW+1
Win32汇编学习笔记(四)
mov@stWndClass.lpszClassName,offsetszClassName
Win32汇编学习笔记(四)
mov@stWndClass.lpszMenuName,offsetIDC_DEMO
Win32汇编学习笔记(四)invokeRegisterClassEx,[email protected]
;注册窗口类
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四);
建立并显示窗口
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四)
invokeCreateWindowEx,WS_EX_CLIENTEDGE,offsetszClassName,addrszCaptionMain,/
Win32汇编学习笔记(四)WS_OVERLAPPEDWINDOW,/
Win32汇编学习笔记(四)
100,100,600,400,/
Win32汇编学习笔记(四)NULL,NULL,hInstance,NULL
;创建窗口,发出一个WM_CREATE消息
Win32汇编学习笔记(四)
movhWinMain,eax;保存窗口句柄
Win32汇编学习笔记(四)
invokeShowWindow,hWinMain,SW_SHOWNORMAL;显示窗口
Win32汇编学习笔记(四)
invokeUpdateWindow,hWinMain;发出一个WM_PAINT消息
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四);
第一种消息循环,使用GetMessage,同步的
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四)
;.whileTRUE
Win32汇编学习笔记(四)
;invokeGetMessage,[email protected],NULL,0,0
Win32汇编学习笔记(四)
;.break.ifeax==0;stMsg为0,即收到WM_QUIT消息时退出
Win32汇编学习笔记(四)
;invokeTranslateMessage,[email protected]
Win32汇编学习笔记(四)
;invokeDispatchMessage,[email protected]
Win32汇编学习笔记(四)
;.endw
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四);
另一种消息循环,使用PeekMessage,异步的
Win32汇编学习笔记(四);
*************************************************************
Win32汇编学习笔记(四)
.whileTRUE
Win32汇编学习笔记(四)invokePeekMessage,[email protected],NULL,
0,0,PM_REMOVE
Win32汇编学习笔记(四).ifeax!=
0
Win32汇编学习笔记(四)[email protected]==WM_QUIT
Win32汇编学习笔记(四)invokeTranslateMessage,[email protected]
Win32汇编学习笔记(四)invokeDispatchMessage,[email protected]
Win32汇编学习笔记(四).else
Win32汇编学习笔记(四)
;空闲时间,可以做其他处理工作
Win32汇编学习笔记(四)
.endif
Win32汇编学习笔记(四).endw
Win32汇编学习笔记(四)
ret
Win32汇编学习笔记(四)_WinMainendp
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四);
程序入口点
Win32汇编学习笔记(四);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)
start:
Win32汇编学习笔记(四)
call_WinMain
Win32汇编学习笔记(四)invokeExitProcess,NULL
Win32汇编学习笔记(四)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Win32汇编学习笔记(四)
endstart
Win32汇编学习笔记(四)

nmake编译后运行如下图:

Win32汇编学习笔记(四)