MASM系列编译器编译win32汇编程序步骤

1.MASM编译器介绍

MASM是微软推出的汇编编译器。他的版本从低到高经历了很多次的升级(微软通病,升级补丁多如牛毛).每次升级除了例行的错误修正外都增加了一些新的功能,以至于到最后高版本和低版本的语法和功能相差很多,向下兼容性也不好。低版本的MASM固然无法编译高版本的源程序,但高版本的MASM也可能无法正常编译低版本的源程序,如MASM4.0写的源程序撑场无法在MASM6.x上编译成功。在使用MASM系列编译器时,如果不先搞清楚特定的语法和编译选项可以在哪个版本上用,编译中就会错误连篇。所以有必要了解一下MASM个版本的演变过程。

续表:

不同版本的MASM产生的obj文件格式也不相同,在DOS和win16时期,微软使用obj文件格式为OMF格式,到了win32时期改用COFF文件格式,原因是COFF文件更像是最终的PE文件,在链接的时候可以做更少的处理,MASM从6.11版本开始支持COFF格式。

用微软的产品编写win32程序,不管使用vc还是MASM,都必须使用COFF格式,因为微软的32位的Link只支持COFF格式的obj文件链接成PE文件,另外所有的到入库等支持文件的格式也全部是COFF格式的。

2.Ml.exe的用法

不同版本的MASM在使用上有很大的不同,本节所指的是可用于win32汇编编程的MASM6.14以上的版本,MASM编译器的命令用法如下:

要注意的是汇编选项要集中写在源文件名的前面,例如:

例1:

例2:

虽然他们都可以编译成Test.asm文件,但第二句的/Cp选项由于写在了源文件名的后面,实际上被忽略了。另外多个选项之间一定要加空格。

Ml在win32汇编编程中常用的选项如表2.2所示。

与用MASM5.0及以下的版本编译DOS程序相比,用MASM的高版本编写win32程序有几个必须使用的选项,如/coff等。另外,用/zi增加调试信息在源码级调试中也很有用。

3.Link的用法

用Ml.exe编译的COFF格式的obj文件可以用Link链接成可执行PE文件,微软的Link.exe有两个系列的版本,用于链接DOS程序的链接器为Segmented Executeable Linker;用于win32 PE文件的链接器为Increamental Linker,这里指的是后者的用法。

Link的命令使用方法为:

命令行参数中的文件列表用来列出所有需要链接到可执行文件中的模块,可以指定多个obj文件和res资源文件以及到入库文件。Link的选项如下所示。

续表:

可见Link的选项远比MASM的要复杂,但并不是所有的选项都频繁使用,编写普通的win32可执行文件时,必须用的选项只有/subsystem一个,其他的都可以用默认值。

如下例子:

在Ml中使用/c选项表示只生成obj文件而不是直接产生exe文件,原因是链接的时候可能跟需要指定资源文件,所以不能让Ml直接用默认方式链接;/coff选项是必须的,因为链接器支支持COFF格式的obj文件,其他的选项如/Cp和/Gz虽然也是必须的,但是由于可以在asm源文件中用伪定义设置,所以一般不在命令行中指定,以免遗漏。

在使用Link的时候,/subsystem选项必须被指定,一般指定为windows,当编译控制台程序的时候为console。写dll的时候/def指定列表定义文件,同时指定/dll选项。其他一些参数如/stdb,/section和/base等只在编写特殊用途的程序时才使用。

猜你喜欢

转载自blog.csdn.net/paradox_1_0/article/details/90142870