WIN32汇编语言教程:第02章 准备编程环境 · 2.2 编译器和链接器(3)
2.2.4 MASM,TASM还是NASM
既然编写Win32汇编可以使用的编译器有这么多种,那么我们究竟使用哪一种呢?单从编译器的角度来说,用MASM写汇编程序是最方便的,支持@@标号,用invoke调用子程序,支持局部变量和有 .if/.else /.endif高级语法等优点就已经是足够的理由了,更不用说有Microsoft这个强大的后盾了,这是其他的编译器所无法比拟的,但使用MASM的不方便之处是它从来就不是当做一个完整的软件包发售的,要开始用MASM写Win32程序还要费很大的周折。
不同版本的MASM软件包中都没有包含资源编译器,资源编译器是当做Windows SDK的一部分发行的,或者要从Microsoft Visual Studio软件包的Common目录中找,更有甚者,和MASM软件包一同发售的Link程序竟然不是32位的,只能用来链接DOS程序,即使是6.11以上版本中也是如此。迄今为止,MASM软件包中附带的链接程序全是Segmented Executable Linker,Incremental Linker只能在Microsoft Visual Studio软件包的Visual C++目录中找到。
其他一些有用的工具也没有包含在软件包中,如库管理工具和make工具等,所以要使用MASM进行Win32汇编编程就要对软件包进行改造:一方面舍弃MASM软件包中附带的Link程序;另一方面,需要到其他地方去找资源编译器和32位的链接器等工具软件。
对初学者来说,连Win32汇编的开发要哪几个步骤及需要用什么软件都还没有底,就更不用说从不同的工具包中寻找需要的软件了(而且必须是合适的32位版本);另外,Win32编程用到的导入库在MASM软件包中并没有包括,同样要到Visual C++中去找;最重要的障碍是:MASM软件包中没有头文件,也不可能直接使用Visual C++的头文件,所有这些头文件必须自己根据资料以及参考Visual C++的 .h文件整理出来,而Windows的数据结构和预定义的数据是出了名的多,所有这些让使用MASM编写Win32汇编程序非常难以下手。
从工具包的完整性来说,TASM和NASM相对来说要好一点,TASM软件包中包括了32位的资源编译器和链接器,也有一个32位的导入库文件,这样,用户不用添加任何其他软件就可以直接用TASM写出完整的Win32程序。但TASM软件包中也没有Windows数据结构和预定义的头文件,所有资料同样需要用户自己整理。
另一方面,和MASM相比,TASM在优化方面做得不是很好,简单举几个例子:比如TASM无法处理大量的预定义,如果用户把所有的预定义整理到Windows.inc文件中,然后在源文件中包括进来,编译的时候就会出现“Out of hash space”错误,结果每次只好把要用到的定义分拣出来写成一个小的include文件;再比如在源程序中用extrn定义API函数,不管在程序中实际有没有用到这个函数,TASM都会在最后 .exe文件的导入表中加上这个函数名,这就意味着无法用偷懒的办法把所有的API函数声明写到一个include文件中去,除非用户可以忍受可执行文件中无效的字节数比有效的多得多!还有一个缺点是:TASM在定义结构的时候,不同的结构中不能有同名的字段,而Windows的数据结构定义出奇的多,结果不同结构中的同名字段要在前面加上其他内容以示区别,这就使结构定义和参考资料在字面上不符合,使用时要不停地去看结构中的字段究竟是怎么定义的。这些小缺点使TASM在使用时程序员做的无效工作比有效工作还多。
NASM的优点就是学到的语法可以直接用在Linux的汇编中,缺点也是显而易见的,就是免费软件往往缺乏强大的后盾,开发的力度肯定不如大的软件公司,具体就表现在NASM中几乎没有一点可以帮程序员省心的高级语法,而这些恰恰是编写高可维护性程序所必须具有的特征。而且,用NASM编程同样存在用户自己整理数据结构定义和预定义的问题。
比较这些编译器,可以发现很难找到直接拿来就可以开始写Win32汇编程序的软件包,因为每个软件包中都没有关键的头文件,而用户自己整理头文件不仅使程序的可移植性大打折扣,而且工程量之大使程序员只能写很小规模的程序,所以,理想的软件包应该是这样的:
● 包含所有所需工具,如汇编编译器、资源编译器和链接器等。
● 编译器支持高级语法,使源程序便于维护。
● 包含完整的头文件,如Windows的数据结构定义和预定义等。
● 包含齐全的导入库。
● 有大量的例子和说明文档。
有这样的汇编软件包吗?有!MASM32软件包就是我们的选择。
2.2.5 我们的选择——MASM32软件包
读者可能会感到奇怪,怎么又出来一个MASM32,这是什么公司的产品呢?实际上,MASM32是不同工具软件的大集合,它的汇编编译器用的是MASM软件包中的Ml.exe,资源编译器和32位链接器用的是Microsoft Visual Studio中的Rc.exe和Link.exe,同时包含了Microsoft Visual Studio中的其他一些工具,如Lib.exe和DumpPe.exe等,所有的工具都是适合于Win32编程的版本。
同时,MASM32软件包包括了详尽的头文件和导入库文件,导入库文件取自Visual C++的导入库,规模庞大的头文件则是发布者整理的,软件包中还包括了很多的例子,涉及Win32汇编的很多方面,例子收集自世界各地Win32汇编爱好者发布的源程序。为了使工具包更实用,发布者还为它编写了一个简单的IDE环境,包括一个专用的汇编源程序编辑器和源程序模板生成器等。
MASM32软件包使汇编不再只用来编写简单的程序和少量的核心模块,它的目标完全是为了用汇编写出专业的大型程序。虽然它是一个大杂烩,但发布者做了所有汇编程序员都想做、却又在庞大的工程量前止步的工作——收集合适的工具软件,收集导入库,整理出完整的头文件,收集例子文件,写帮助文档......
让我们感谢发布者Steve Hutchesson为所有的汇编程序员所做的这一切。
迄今为止,MASM32的最高版本是MASM32V7,和早一些的MASM32V6和MASM32V5版本相比,使用的编译器等可执行文件并没有什么改变,不同的地方是在头文件中增补了一些数据结构定义和增加了不少例子程序。最新版本的MASM32软件包可以在发布者的主页http://www.movsd.com中下载。MASM32是一个免费的软件包,但其中的不同部分如编译器和例子程序等可能属于不同的公司和个人,使用时需要遵从他们的版权声明。
MASM32的安装界面如图2.2所示。
安装MASM32时,在选择目标驱动器后,工具包会被安装到根目录下的MASM32目录中。读者需要知道一些重要文件的位置,这在使用时非常重要,MASM32下各目录的列表和说明如表2.7所示。
图2.2 MASM32的安装界面
表2.7 MASM32的目录说明
目 录 | 介 绍 |
\masm32 | IDE环境、内带的文本编辑程序和模板生成程序等 |
\masm32\include | 所有的头文件,Windows.inc为数据结构和预定义值的定义文件,Resouce.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汇编编程了,其他目录中的文件仅起辅助作用。
本书的编程环境就是以MASM32软件包为基础的,事实上,现在MASM32已经是最流行的Win32汇编开发包,世界上大部分的Win32汇编程序员都用它来进行Win32软件开发。