汇编语言是一种以
处理器指令系统为基础的低级语言,采用
助记符表达指令
操作码,采用
标识符表示指令
操作数。作为一门语言,对应于高级语言的
编译器,需要一个“
汇编器”来把汇编语言原文件汇编成机器可执行的代码。常用的高级语言编译器有Microsoft公司的MASM系列和Borland公司的TASM系列编译器,还有一些小公司推出的或者免费的汇编软件包等。
编译器介绍
MASM是Microsoft公司推出的汇编编译器。它的版本从低到高经过了很多次的升级(微软的通病,升级补丁多如牛毛)。
每次升级除了例行的错误修正外都增加了一些新的功能,以至于到最后高版本和低版本的语法和功能相差很多,向下兼容性也不好。低版本的MASM固然无法编译高版本的源程序,但高版本的MASM也可能无法正常编译低版本的源程序,如MASM 4.0写的源程序常常无法在MASM 6.x上编译成功。在使用MASM系列
编译器时,如果不先搞清楚特定的语法和编译选项可以在哪个版本上用,编译中就会错误连篇。所以在这里有必要了解一下MASM各版本的演变过程
下表列出了不同版本MASM编译器的区别。
版 本
简 介
MASM 4.00
这是最先广泛使用的一个MASM版本,适用于DOS下的汇编编程。它很精巧,但使用起来不是很智能化,需要用户自己一板一眼地写出所有的东西。很多教科书上讲的8086汇编语法都是针对这个版本的,对程序员来说。它只比用Debug方便一点点。
MASM 5.00
MASM 5.00比4.00在速度上快了很多,并将段定义的
伪指令简化为类似 .code与.data之类的定义方式,同时增加了对80386
处理器指令的支持,对4.00版本的兼容性很好
MASM 5.10
对程序员来说,这个版本最大的进步是增加了对@@标号的支持。这样,程序员可以不再为标号的起名花掉很多时间。另外,MASM 5.10增加了对OS/2 1.x的支持
MASM 5.10B
1989年推出,比上一个版本更稳定、更快,它是传统的DOS
汇编编译器中最完善的版本
MASM 6.00
1992年发布,有了很多的改进。编译器可以使用
扩展内存,这样可以编译更大的文件,可执行文件名相应从Masm.exe改为Ml.exe。从这个版本开始可以在命令行上用*.asm同时编译多个源文件,源程序中数据结构的使用和
命令行参数的语法也更像C的风格。最大的改进之一是开始支持 .if/.endif这样的高级语法,这样,使用复杂的条件分支时和用高级语言书写一样简单,可以做到几千行的代码中不定义一个标号;另外增加了invoke
伪指令来简化带参数的
子程序调用。这两个改进使
汇编代码的风格越来越像C,可读性和可维护性提高了很多
MASM6.00A
未发售的版本
MASM 6.00B
最后一个支持OS/2的MASM版本,修正了上一版本中的一些错误
MASM 6.10
修正了一些错误,同时增加了/Sc选项,可以在产生的list文件中列出每条指令使用的
时钟周期数
MASM6.10A
MASM 6.11
1993年11月发布,支持Windows NT,可以编写Win32程序,同时支持Pentium指令,但不支持MMX指令集
MASM6.11C
1994年发布,增加了对Windows 95 VxD的支持
MASM 6.12
1997年8月发布,增加 .686,.686P,.MMX声明和对相应指令的支持
MASM 6.13
1997年12月发布,增加了 .K3D声明,开始支持
AMD处理器的3D指令
MASM 6.14
这是一个很完善的版本,它在 .XMM中增加了对Pentium III的SIMD
指令集的支持,相应增加了OWORD(16字节)的变量类型
MASM 6.15
用法
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的常用选项如下表所示。
选 项
简 介
/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格式不兼容
NASM
NASM是一个为可移植性与模块化而设计的一个80x86的
汇编器。它支持相当多
的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16
位的'OBJ'和'Win32'。它还可以输出纯
二进制文件。它的语法设计得相当的简
洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!',