【交流】架设WIN32汇编程序的开发环境
1. 下载并安装Ultraedit[url=http://www.ultraedit.com/]链接标记http://www.ultraedit.com/[/url]
我安装的版本是12.20b+1官方中文版,安装路径不重要。
2.下载并安装MASM
[url=http://www.masm32.com/]链接标记http://www.masm32.com/[/url]
我安装的是Version 9,安装路径为:D:\masm32
3.make工具
[url=http://211.90.241.130:22366/view.asp?file=53]链接标记http://211.90.241.130:22366/view.asp?file=53[/url]
压缩包中有两个make工具
nmake.exe是Microsoft (R) Program Maintenance Utility Version 1.50
make.exe是MAKE Version 4.0 Copyright (c) 1987, 1996 Borland International
这两个make工具所支持的Makefile语法和常用的选项大同小异。
把nmake.exe和make.exe解压到Masm32安装目录的bin子目录下。
4.编写一个用于设置环境变量的批处理文件var.bat
文件的内容如下:
@echo off
rem 请根据 Masm32 软件包的安装目录修改下面的 Masm32Dir 环境变量!
set masm32Dir=D:\masm32
set include=%masm32Dir%\Include;%include%
set lib=%masm32Dir%\lib;%lib%
set path=%masm32Dir%\Bin;%masm32Dir%;%PATH%
set masm32Dir=
echo on
把var.bat放到Masm32安装目录的bin子目录下。
每打开一个新的命令行控制台,就要执行一次var.bat文件。
省力的做法是把环境变量添加到用户变量,或系统变量中去。
可以使用下列命令查看环境变量的设置情况:
C:\>echo %include%
C:\>echo %lib%
C:\>echo %path%
5.编写makefile
makefile的内容如下:
EXE = Test.exe #指定输出文件
OBJS = Test.obj #需要的目标文件
RES = Test.res #需要的资源文件
LINK_FLAG = /subsystem:windows #连接选项
ML_FLAG = /c /coff #编译选项
$(EXE): $(OBJS) $(RES)
Link $(LINK_FLAG) $(OBJS) $(RES)
.asm.obj:
ml $(ML_FLAG) $<
.rc.res:
rc $<
clean:
del *.obj
del *.res
需要注意的地方:
1) nmake默认将Makefile文件的第一条规则中的目标文件作为最终文件。例子中的最终文件就是Test.exe
2) 引用EXE或OBJS这些宏时一定要加上括号,如:$(EXE)、$(OBJS) 、$(RES)
3) makefile的换行符是“\”,“\”后面不能再加上其它字符,包括注释和空格
4) 隐含规则中几个用来指定文件名的特殊预定义宏
$@ - 目标文件的全路径文件名
$* - 目标文件的除去扩展名的全路径文件名
$? - 所有源文件(依赖文件)的文件名
$< - 源文件(依赖文件)的文件名
5)显式规则的定义格式:
目标文件 : 依赖文件
命令
6)隐含规则的定义格式:
.源扩展名.目标扩展名:
命令
用MASM编译和链接一个Win32汇编源程序常用的命令是:
ml /c /coff xx.asm
link /subsystem:windows xx.obj yy.lib zz.res (普通PE文件)
link /subsystem:console xx.obj yy.lib zz.res (控制台文件)
link /subsystem:windows /dll /def:aa.def xx.obj yy.lib zz.res (DLL文件)
6.执行nmake.exe
nmake的常用选项如下:
/? 显示帮助信息
/f 指定描述文件(makefile)的文件名
/x 把屏幕输出的信息存到一个文件中
/a 强制更新所有文件
/b 文件时间相等时也要更新文件
/d make时显示文件新旧信息
/n 显示make时要执行的命令,但并不真正执行
/p make是显示详细的信息
宏定义 用新的定义覆盖描述文件(makefile)中的宏定义
目标 指定建立描述文件(makefile)中描述的某个文件
例子:
make clean 用于清除编译过程中产生的临时文件,即执行del *.obj和del *.res两条命令;
make test.obj 只编译test.asm生成test.obj文件;
make test.res 只编译test.rc生成test.res文件
Win32汇编程序的开发调试过程:
编译源程序->切换到MS-DOS窗口->键入nmake编译->运行生成的可执行文件->切换到文本编辑器修改源程序........如此循环往复调试程序。
7.推荐的工作环境
本书建议读者放弃MASM32简单的IDE环境,改为在命令行下用nmake工具进行代码维护,为了建立这个环境,需要做下面的工作。
第1步:安装常用软件,包括编辑软件Editplus,MSDN,16进制编辑器hexedit,可视化资源编辑器Resource Workshop,调试工具Soft-ICE和反汇编软件W32DASM等,如果空间允许的话,最好安装Visual C++,以便使用它集成的资源编辑器。
第2步:选择一个驱动器安装MASM32软件包,安装好的目录是x:\Masm32目录,对读者来说整个软件包中重要的只有3个目录:bin目录中有汇编编译器ml.exe,资源编译器rc.exe和链接器Link.exe等执行文件;include目录中有各种头文件;lib目录中有全部导入库。MASM32没有选择地把安装目录名定为masm32,如果不满意的话,完全可以把这3个关键目录拷贝到别的用户自己命名的目录中,对使用没有任何影响。
第3步:建立源文件目录,由于Win32汇编不再像DOS汇编一样一个项目只有一个asm文件,而是包括asm,rc,makefile和图标等多个文件,如果把多个项目的文件混在同一个目录中将无法分辨,所以必须为每个项目单独建立一个目录,建议把这些目录集中在一个专门放置源程序的目录中,如G:\source目录。
第4步:由于MASM32软件包中没有nmake.exe文件,所以要单独寻找nmake.exe(C:\Program Files\Microsoft Visual Studio\VC98\Bin\nmake.exe)并拷贝到bin目录中(G:\masm32\bin)。
第5步:为这个环境建立一个设置环境变量的批处理文件,假设文件名为Var.bat,那么这个文件内容如下:
@echo off
set include=G:\masm32\include
set lib=G:\masm32\lib
set path=G:\masm32\bin;%path%
echo on
文件中设置了3个环境变量:
● include变量指定头文件的搜索目录。在asm和rc文件中可以根据这个变量寻找include语句指定的文件名,避免了使用头文件的全路径名,这样以后移动了MASM32的安装位置就不必修改每个源文件中的include语句。如果使用Visual C++的集成环境来建立rc文件的话,为了使rc.exe能找到头文件,还要把VC++安装目录下的Include和MFC\Include目录包含进来,中间用“;”隔开:
set include=G:\masm32\include;C:\Program Files\Microsoft Visual Studio\VC98\Include;C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include
VC++安装目录一般为C:\Program Files\Microsoft Visual Studio\VC98\。
● lib变量指定导入库文件的搜索目录。在asm文件中可以根据这个变量寻找includelib语句指定的导入库文件,Link.exe也根据这个变量寻找库文件的位置。
● path变量就不必多解释了。它只是使我们不必在键入命令时带长长的路径而已。
8:小试牛刀
打开一个文件浏览窗口,切换到源文件目录G:\source,然后把本书所带光盘中的Chapter02\Test目录拷贝过来,现在有了一个需要编译的Test.asm文件在G:\source\Test目录中。
cmd打开一个MS-DOS窗口,并键入var执行已建立的var.bat,这时环境变量和路径已经设置好了,可以键入SET命令验证一下include和path等环境串是否正确,
然后键入G:以及cd source\Test切换到要工作的目录中,并键入nmake,当屏幕上出现如下所示的正确的编译链接信息后,Test.exe就建立完成了:
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
ml /c /coff Test.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: Test.asm
rc Test.rc
Link /subsystem:windows Test.obj Test.res
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
执行一下Test.exe,会出现一个简单的对话框,表示一个可以执行的Win32程序正确生成了。万事大吉,这样就可以开始Win32汇编之旅了!
如果编译的过程中出现“can not open file xxx.inc”或“can not open file xxx.lib”的提示时,就要检查Var.bat文件中include或lib的路径是否正确。
下面的工作就是:编辑源程序→切换到MS-DOS窗口→键入nmake编译→运行生成的可执行文件→切换到文本编辑器修改源程序……如此循环往复调试程序。
===============================================================
第二种搭建法:
编译器我选择masm32,其实masm32比tasm32灵活性要差一些,这些灵活的特性有时候在开发外挂的时候是很有效的,比如说tasm32就可以把一些代码直接放进数据段编译也不会报错,这个特性就很容易将你的外挂特殊程序的可执行代码当作数据直接写入到远程数据中去。但是,没有办法啊, masm32资料多些啊。虽然选择了masm32,但是我还是使用了tasm32中的make工具。使用这个工具可以对于方便编译调试可以节省很多工作。
首先下载editplus for masm32.这个工具在 AoGo去下载,下载了后最好还是单独再下载masm32_8 masm32_8_sp1。然后添加搜索路径环境变量,为d:\masm32\bin\。(你需要根据自己的安装目录调整)。将make.exe工具也拷贝到这个目录下。 这个时候,你在控制台下输入,make;ml;link;应该都有反应了。然后书写如下的makefile模板:
----------------------------------------------------------------------------------------
!if $d(RELEASE)
TASMDEBUG=
LINKDEBUG=
!else
TASMDEBUG=/Zi
LINKDEBUG=/DEBUG /DEBUGTYPE:CV
!endif
!if $d(MAKEDIR)
IMPORT=$(MAKEDIR)\..\lib\import32
!else
IMPORT=import32
!endif
NAME=EnumProc
RCNAME = EnumProc
INCLUDE = /I D:\MASM32\INCLUDE
$(NAME).exe: $(NAME).obj $(RCNAME).res
# Link /SUBSYSTEM:WINDOWS /LIBPATH:d:\masm32\lib $(LINKDEBUG) $(NAME).obj
Link /SUBSYSTEM:WINDOWS $(LINKDEBUG) /LIBPATH:d:\masm32\lib $(NAME).obj $(RCNAME).res
#$(RCNAME).res: $(RCNAME).rc
# rc $(INCLUDE) $(RCNAME).rc
$(NAME).obj: $(NAME).asm
ml /c /coff $(TASMDEBUG) $(INCLUDE) /Cp $(TASMDEBUG) $(NAME).asm
clean:
del *.obj
run:
$(NAME).exe
debug:
D:\flyODBG\flyODBG.eXe $(NAME).exe
---------------------------------------------------------------
上面的makefile文件表示:
在控制台下输入:
make ---- 编译程序
make run ----- 运行程序
make debug ----使用olldbg调试程序
make clean ---清楚 obj文件。
你可以在控制台下实验这些命令。当然,你需要将makefile文件拷贝到你源代码的目录,然后将上面的
NAME=EnumProc -----替换为你的工程文件名字
RCNAME = EnumProc -----替换为你的工程文件名字
其他的路径你也要相应的做修改。
然后你可以配置你的editplus,使运行编译和调试都不离开editplus的环境。OK,如此后你就可以在editplus中顺利的编辑编译调试asm程序了。
页:
[1]