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,/la | lst文件的格式:/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 常用汇编编译器列表
编译器 | 简介 | 支持编程 |
NASM | Netwide/National Assembler,开放源代码的免费软件,使用传统的Intel语法 | DOS,Win32,Linux |
FASM | 支持8086-80486/Pentium/MMX/SSE/SSE2指令,16/32位代码 | DOS,Win32 |
SpAsm | Specific Assembler,用于ReactOS/Win32的汇编编译器,有简化的语法和宏指令,自带IDE环境 | Win32 |
VisualASM | 附带IDE环境 | Win32 |
Pass32 | 支持面很广的编译器,一个显著的特点是支持DOS extender,可以直接将DOS extender链接到可执行文件中 | DOS,Win32,DOS DPMI |
GASM | GNU Assembler,兼容NASM,可以用于DOS下的保护模式编程 | DOS |
Nbasm | NewBASIC++ Assembler,适合于建立小规模的汇编程序,用来学习汇编是很不错的 | DOS |
CHASM | Cheap 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)