Win32汇编环境配置
放假了,发现自己知识面窄,趁有时间就打算折腾下Win32汇编。其实在学校也上过汇编课,是基于dos的。那时老师不务正业,老跟我们讲政治经济文化,唯独不怎么讲课;再加上自己的问题,导致了dos汇编学得好烂(几乎没学),但发现dos汇编比较少用,所以直接学Win32汇编了,基础知识薄弱遇到再补上去。我只是多了解其他知识,不求精通。如果要学好还是应该先写好dos汇编的。
介绍
Win32可执行环境的开发过程如下图
常用的编译器有Microsoft的MASM系列和Borland的TASM系列。但都存在一些缺点:
MASM:没有当做完整的开发包发布,会发现在不同版本中都会缺少一些工具,需要在其他地方获得。
TASM:优化方面不好,使用会有点麻烦。
则可以选择使用MASM32 SDK软件包。它是不同工具软件的集合,它的汇编编译器用的是微软MASM软件包中的Ml.exe,资源编译器和32位链接器使用的是Microsoft Visual Studio中的Rc.exe,Link.exe,同时包含了Microsoft Visual Studio中的其他一些工具,如Lib.exe和DumpPe.exe等,所有的工具都是适合于Win32编程的版本。
安装
MASM32 SDK下载地址:http://www.masm32.com/masmdl.htm。
下载后是一个安装文件install.exe。双击打开一直确定或下一步就能完成安装,在这个过程中会有个选择安装目录,并且会测试是否能安装。最终在安装目录出现masm32文件夹。
masm32文件夹中的信息:
目 录 |
介 绍 |
\masm32 |
IDE环境、内带的文本编辑程序和模板生成程序等 |
\masm32\include |
所有的头文件,Windows.inc为数据结构和预定义值的定义文件,Resource.h为资源文件的头文件,其他 .inc文件为对应同名DLL文件中的API函数声明文件 |
\masm32\lib |
所有的导入库文件,每个.lib文件是对应DLL文件的导入库 |
\masm32\bin |
可执行文件目录,里面包括Ml.exe,Link.exe和Rc.exe等 |
\masm32\help |
帮助文件目录 |
\masm32\m32lib |
一些常用C子程序的汇编实现源程序,如熟悉的stdin和stdout等,有一定的参考价值 |
其他目录 |
主要为例子和可用可不用的小工具,例子广泛收集自网上不同作者的作品,很有参考价值 |
如果不用内带的IDE环境,不看附带的例子和帮助文件,那么有了bin,include和lib这三个目录中的内容,就可以进行Win32汇编编程了,其他目录中的文件仅起辅助作用。
使用
设置环境变量
可以在计算机中高级系统设置的环境变量中写死或者每次要编译连接时先执行一个批处理文件Var.bat,退出后所设置的环境变量也会消失掉。
Var.bat
1 @echo off 2 rem 请根据 Masm32 软件包的安装目录修改下面的 Masm32Dir 环境变量! 3 set Masm32Dir=D:\masm32 4 set include=%Masm32Dir%\include;%include%;D:\Program Files\Programing\Microsoft Visual Studio 10.0\VC\include;D:\masm32\include\others_dk\INCLUDE;D:\masm32\include\others_dk\MFC; 5 set lib=%Masm32Dir%\lib;%lib% 6 set path=%Masm32Dir%\bin;%Masm32Dir%;%path%; 7 echo on
编写程序
源代码HelloWorld.asm
.386 .model flat,stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 数据段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .const szCaption db 'MessageBox',0 szText db 'HelloWorld!',0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 代码段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code start: invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK invoke ExitProcess,NULL ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start
资源文件HelloWorld.rc(只有个文件名,内容为空。暂时用不到)
执行
运行批处理文件后,在命令符中进入到源程序的目录下,并分条输入并回车(编译源程序、编译资源、链接),最终会产生可执行文件HelloWorld.exe。
ml /c /coff HelloWorld.asm
rc HelloWorld.rc
Link /subsystem:windows HelloWorld.obj HelloWorld.res
运行后
扩展
每次在命令符都要输入指令,比较麻烦。可以使用make工具(Microsoft中叫nmake.exe,可以在Visual C++的bin目录下找到)。把MakeFile放到源程序的文件目录下,要编译运行源程序只要在命令符输入的编译等指令时替换成nmake就可以。
MakeFile
1 NAME = HelloWorld 2 OBJS = $(NAME).obj 3 RES = $(NAME).res 4 5 LINK_FLAG = /subsystem:windows 6 ML_FLAG = /c /coff 7 8 $(NAME).exe: $(OBJS) $(RES) 9 Link $(LINK_FLAG) $(OBJS) $(RES) 10 11 .asm.obj: 12 ml $(ML_FLAG) $< 13 .rc.res: 14 rc $< 15 16 clean: 17 del *.obj 18 del *.res
参考:罗云彬的《Windows环境下32位汇编语言程序设计》