luqingfei@C++

为中华之崛起而崛起!
兼听则明,偏听则暗。

Win32汇编--准备编程环境

 

准备编程环境

 

Win32可执行文件的开发过程

DOS下,生成一个可执行文件的步骤比较简单,用编译器将源程序编译为obj文件,再用链接器将obj文件链接成exe文件。

 

DOS可执行文件中的内容基本上是由源程序中所写的代码和数据定义转换而来的。

唯一的例外是带覆盖部分的exe文件,它在基本的exe文件的附加了一些自定义的数据,可执行部分的长度由文件头偏移0002h0004h中的长度给出,后面就是附加上去的数据。这样,即使一个带覆盖的exe文件大小远远超过640KB,在DOS下也能运行。因为操作系统只装入真正的可执行部分,然后由程序自己去读取覆盖部分的数据。一些打包软件生成的奇大无比的自解压包就采用这种结构,可执行部分是解包代码,覆盖部分是被压缩的数据。DOS对可执行文件覆盖部分的数据格式并没有规定,它是程序员按自己的方式组织的。如果程序员愿意,也可以把这些数据单独放在另外一个文件中。

 

Win32可执行文件叫做PE文件PE文件的基本结构和DOS可执行文件有很大的不同。它把程序中的不同部分分成各种节区(Section),其中可以有一个节区是放置各种资源的,如菜单、对话框、位图、光标、图标和声音等。虽然可以把资源部分理解成类似DOS可执行文件中的覆盖部分,但资源是Win32可执行文件的标准组成部分,而且是非常重要的组成部分。所以和DOS软件的开发过程相比,Win32软件的开发中多了一个创建资源文件的步骤。

 

Win32汇编开发软件的流程,分为创建代码和创建资源两部分。

 

代码部分的开发工作和DOS下写代码的步骤是一样的。

 

程序员用文本逻辑器书写汇编源代码(*.asm文件),这和C源程序类似。asm文件中也可以用include语句包含数据定义和函数声明的头文件。Win32汇编的头文件一般用inc作扩展名。asm文件经汇编编译器编译成以obj为扩展名的目标文件。

 

资源文件中可以包括对话框、快捷键、菜单、字符串、版本信息和一些图形资源等内容。资源文件的源文件是一种类似脚本的文本文件。其中用不同的语法定义了不同类型的资源。资源脚本文件的扩展名一般为rc,经过资源编译器编译成资源文件*.res。资源脚本文件同样用到很多预定义值,所以软件包中一般也有资源头文件可供源文件来导入。

 

在资源文件中,对话框资源只记录定义值,如对话框的大小、位置等,并非真正存储对话框最后显示在屏幕上的像素。这些大小、位置等信息最后由Windows解释后才在屏幕上被绘画成像素;菜单、字符串、快捷键等由文本构成;图形资源则真正由像素组成,它们在资源脚本中被定义为一个文件名,由资源编译器从磁盘文件导入。Windows在资源文件中支持的图形文件有bmp位图文件、cur光标文件和ico图标文件。wav声音文件也是得到支持的。

 

编译好目标文件*.obj和资源文件*.res后,最后一步是用链接器将它们链接成可执行文件。链接的时候要用到函数库。在DOS环境下编程的时候,使用的函数库是静态库。静态库是一些已经编译好的代码模块。当用户在源程序中用到某个函数的时候,链接器从库文件中将这个函数的二进制代码取出,和obj文件合在一起生成最终的exe文件。但在Win32环境下,大部分的公用函数封装在DLL文件中,以动态链接的方式供用户程序调用。这时候库文件中只需要包含函数在DLL中的位置信息,不再需要有二进制代码部分。所以链接的时候也只是把库文件中的位置信息取出放入最后的可执行文件中。Win32中这种只包含位置信息的库文件称为导入库。

 

Win32汇编编程中使用不同汇编编译器的时候,汇编源程序的格式和资源脚本文件的格式可能稍微有所不同。各种头文件、库文件的文件名也有所不同。所以在开始编程之前,必须先选定一种合适的编译器。

 

编译器和链接器

选择MASM32软件包,它是不同工具软件的大集合,它的汇编编译器用的是MASM软件包中的ML.exe,资源编译器和32位链接器用的是Microsoft Visual Studio中的Rc.exeLink.exe,同时包含了Microsoft Visual Studio中的其他一些工具,如Lib.exeDumpPe.exe等,所有的工具都适合于Win32编程的版本。

 

MASM32软件包包括了详尽的头文件和导入库文件,导入库文件取自Visual C++的导入库,规模庞大的头文件则是发布者整理的,软件包中还包括了很多例子,涉及Win32汇编的很多方面,例子收集自世界各地Win32汇编爱好者发布的源程序。

 

MASM32软件包使汇编不再只用来编写简单的程序和少量的核心模块,它的目标完全是为了用汇编写出专业的大型程序。虽然它是一个大杂烩,但发布者做了所有汇编程序中都想做、却又在庞大的工作量前止步的工作:收集合适的工具软件,收集导入库,整理出完整的头文件,收集例子文件,写帮助文档。

感谢发布者Steve Hutchesson为所有的汇编程序员所做的这一切。

最新版本的MASM32软件包可以在发布者的主页http://www.movsd.com/中下载。

MASM32是一个免费的软件包,但其中的不同部分如编译器和例子程序等可能属于不同的公司和个人,使用时需要遵从他们的版权声明。

 

 

创建资源

资源编译器的使用

可以使用Visual C++的资源编辑器。

 

 

make工具

DOS时期编写汇编程序的时候,编译器和链接器基本上不用什么参数,命令只有区区两条:

       Mask xxx.asm;

       Link xxx.obj;

只要做个批处理把xxx换成%1,然后在命令行键入asm.bat xxx就万事大吉了,很是方便。

 

Win32编程就不一样了,不管编译器还是链接器都需要加上必要的选项,文件列表也多了起来,如链接器的命令行参数中要列出objlibresdef等多种文件,又多了资源编译这一步,如果用批处理实现,要加的参数太多太乱,而每次用手工一行行地键入命令的话,那对程序员来说简直就是一场灾难。当然,一种简单的解决办法就是为每个编程项目单独建立一个批处理,每次改动后,运行批处理把所有模块重新编译一次,但是当程序很庞大的时候,这将花费很长时间,那么该如何处理呢?这时候就要用到make工具来维护代码了。

 

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,同样是用类似于批处理的方式,通过调用用户指定的语句来进行编译和链接。但是,批处理会执行全部命令将全部资源文件编译,包括那些不必重新编译的源文件,而make工具则可以根据目标文件上一次编译的时间和所依赖的源文件的更新时间自动判断应当编译哪些源文件,对没有更新过的文件不会处理,这样就可以大大提高程序调试的效率。

 

Microsoftmake工具文件名为nmake.exe,它并不是MASM软件包的一部分,但可以在Visual C++Bin目录下找到。

 

 

nmake的用法

在命令行键入nmake/?可以显示帮助信息,nmake的语法为:

nmake [选项] [/f 描述文件名] [x/ 输出信息文件名] [宏定义] [目标]

 

说明如下:

/f 参数 ——如果描述文件名不使用默认的makefile,可以用/f参数指定。

 

 

描述文件的语法

make工具最主要也是最基本的功能就是通过描述文件来描述源程序之间的相互关系并自动维护编译工作,而描述文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,并要求定义源文件之间的依赖关系,为了更方便使用,文件中同时可以用一些宏定义。描述文件一般需要包含以下内容:

1)注释

2)宏定义

3)显式规则

4)隐含规则

 

# nmake工具的描述文件例子

EXE = Test.exe                    #指定输出文件

OBJS = x.obj\

              y.obj                            #需要的目标文件,可用反斜杠换行

RES = x.res                         #需要的资源文件

 

LINK_FLAG = /subsystem:windows           #链接选项

ML_FLAG = /c /coff                                 #编译选项

 

#定义依赖关系和执行命令

$(EXE): $(OBJS) $(RES)

               Link $(LINK_FLAG) /out:$(EXE) $(OBJS) $(RES)

$(OBJS):Common.inc

y.obj:y.inc

 

#定义汇编编译和资源编译的默认规则

.asm.obj:

       ml $(ML_FLAG) $<

.rc .res:

rc $<

 

#清除临时文件

clean:

      del *.obj

      del *.res

 

 

构建开发环境

以下是推荐的一种开发环境。

1)安装常用软件,包括文本编辑软件EditPlusMSDN16进制编辑器hexedit,调用工具Soft-ICE和反汇编软件W32DASM等。资源编辑器用Visual C++集成的。

2)选择一个驱动器安装MASM32软件包,安装好的目录是x:\masm32 目录,整个软件包中重要的只有3个目录:bin目录中有汇编编译器ml.exe,资源编译器rc.exe和链接器Link.exe等执行文件;include目录中有各种头文件;lib目录中有全部导入库。

3)建立源文件目录,由于Win32汇编不再像DOS汇编一样一个项目只有一个asm文件,而包括asm,rc,makefile和图标等多个文件,如果把多个项目的文件混在同一个目录中将无法分辨,所以必须为每个项目单独建立一个目录,建议把这些目录集中在一个专门放置程序的目录中,如x:\source目录。

4)由于MASM32软件包中没有nmake.exe文件,所以要单独寻找namke.exe并拷贝到bin目录中。

5)为这个环境建立一个设置环境变量的批处理文件,假设文件名为var.bat,那么这个文件内容如下:

@echo off

set include=x:\masm32\include

set lib=x:\masm32\lib

set path=x:\masm32\bin;%path%

echo on

 

 

尝试编译第一个程序

ms-dos -> var.bat -> nmake;即可生成一个exe文件。

下面的工作就是:编辑源程序->切换到ms-dos窗口->键入nmake编译->运行生成的可执行文件->切换到文本编辑器修改源程序……如此循环往复调试程序。

 

 

posted on 2010-08-06 16:25 luqingfei 阅读(987) 评论(0)  编辑 收藏 引用 所属分类: Win32汇编程语言序设计


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

留言簿(6)

随笔分类(109)

随笔档案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜