WIN32汇编语言教程:第02章 准备编程环境 · 2.2 编译器和链接器(2)

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

一般来说,用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文件)

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

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

2.2.2  TASM系列

1. TASM的用法

TASM是Borland公司推出的汇编编译器,也是一种使用很广泛的编译器,和MASM相比,TASM的升级没有这么频繁。TASM早在1.0版本就有了对80386处理器指令的完全支持(MASM要到5.0版本才支持80386指令),1989年推出的1.01版本修正了1.0版的一些错误;早期的版本还有TASM 3.0和TASM 4.0,其中4.0版是TASM系列编译器编写DOS程序使用最广泛的版本。

到目前为止,TASM的最后一个版本是5.0版,这个版本支持Win32编程,并单独为Win32编程附带有一整套的32位程序:32位的编译器TASM32.EXE、链接器TLINK32.EXE和资源编译器BRC32.EXE。与这些32位程序对应的16位工具在软件包中依然存在,文件名为TASM.EXE,TLINK.EXE和BRC.EXE等。

TASM 5.0命令行的使用方法是:

TASM32 [选项] 源文件名[,[目标文件名],[列表文件名],[索引文件名]][;]

在Win32编程时TASM的常用选项如表2.4所示。

表2.4  TASM 5.0的常用选项

选项简介
/ml,/mx,/mu对大小写是否敏感:ml=全部敏感,mx=全局变量大小写敏感,mu=不敏感,Win32编程中必须用ml选项
/m#允许第#次编译扫描时可以向前引用,一般使用/m2
/i路径设定include文字所在的路径
/l,/lalst文件的格式:/l为正常格式,/la为扩充格式
/zi,/zd,/zn符号调试信息的控制:/zi为全部,/zd为仅有行号,/zn为不产生调试信息

TASM和MASM之间的导入库和目标文件等不能通用,程序员无法用Microsoft的链接器来链接TASM产生的obj文件,反之亦然,这是因为TASM的库文件和obj文件一直是OMF格式,与Microsoft使用的COFF格式不兼容。

TASM不是免费软件,无法从Borland的网站上直接下载,但在网上随处可以找到TASM 5.0版本的下载链接,Borland网站中仅提供了5.0版本到5.0r版本的升级包,升级包的下载地址是:

http://www.borland.com/borlandcpp/cppcomp/tasmfact.html

2. TLINK的用法

与TASM32.exe配合的链接器为TLINK32.exe,它的用法是:

TLINK32 选项 目标文件列表,输出文件,map文件,库文件,def文件,资源文件

指定这些文件名的时候,中间必须用逗号隔开,如果不想指定某个文件名,可以在逗号中间留空,TLINK32的常用选项如表2.5所示,注意,TASM32的选项是用斜杠开头, TLINK32的选项却用减号开头。


表2.5 TLINK32的选项

选项简介
-c链接时区分大小写
-B:xxxx指定可执行文件装入内存的基地址
-Txx输出文件类型,-Tpe表示输出PE类型的exe文件,-Tpd表示输出PE类型的dll文件
-ax文件类型,-aa表示使用Windows API,-ap表示使用兼容代码
-v在输出文件中包括调试信息

下面是用TASM编译和链接一个Win32汇编源程序的常用命令:

TASM32 /ml /m2 xx.asm

TLINK32 /Tpe /aa /c xx.obj,,,yy.lib,,zz.res    (普通PE文件)

TLINK32 /Tpd /aa /c xx.obj,,,yy.lib,aa.def,zz.res  (DLL文件)

Windows API区分大小写,所以TASM32的/ml和TLINK32的-c选项必须指定,TLINK32中的-Tpe和-aa选项也必须指定,否则链接出来的就不是Win32可执行文件了。其他的选项如调试信息等则可以根据需要选择使用。

2.2.3 其他编译器

除了MASM和TASM这两种主流的汇编编译器,汇编编程中还可以用到一些其他的编译器,这些编译器大部分是免费的,如表2.6所示。

表2.6 常用汇编编译器列表

编译器简介支持编程
NASMNetwide/National Assembler,开放源代码的免费软件,使用传统的Intel语法DOS,Win32,Linux
FASM支持8086-80486/Pentium/MMX/SSE/SSE2指令,16/32位代码DOS,Win32
SpAsmSpecific Assembler,用于ReactOS/Win32的汇编编译器,有简化的语法和宏指令,自带IDE环境Win32
VisualASM附带IDE环境Win32
Pass32支持面很广的编译器,一个显著的特点是支持DOS extender,可以直接将DOS extender链接到可执行文件中DOS,Win32,DOS DPMI
GASMGNU Assembler,兼容NASM,可以用于DOS下的保护模式编程DOS
NbasmNewBASIC++ Assembler,适合于建立小规模的汇编程序,用来学习汇编是很不错的DOS
CHASMCheap Assembler,用于MS-DOS编程的共享软件DOS

值得一提的是NASM,这个编译器也支持Win32汇编,不同于MASM和TASM这两个编译器,它是免费软件并且开放源代码,如果读者对编译器的原理感兴趣的话,可以从网上下载整个NASM的软件包来看一看,NASM的官方站点网址是http://nasm.octium.net。

NASM不具有MASM和TASM所拥有的一些高级语法,如将带参数的调用语句自动转化成多个push指令和一个call指令,更没有MASM所有的 .if/.endif等高级语法,这使NASM用于Win32编程相当不方便,整个感觉和用MASM 4.0差不多,几乎所有的细节都需要用户自己写。但NASM的一个显著优点部分地抵消了这个缺点,因为它支持不同的平台,如Windows,Linux和OS/2等,用它写Win32程序虽然有些麻烦,但熟悉了它的语法后可以很快在Linux的汇编中上手,所以使用NASM的程序员还是不少。

上页:第02章 准备编程环境 · 2.2 编译器和链接器(1) 下页:第02章 准备编程环境 · 2.2 编译器和链接器(3)

第02章 准备编程环境

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号