masm

MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32Asm是Windows下开发汇编的利器。它与windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM的开发人员必须在windows下进行开发。

masm32

MASM32 是一个为那些对学习或者编写 32 位微软汇编( MASM )感兴趣 的程序员提供的工作环境,它最流行的版本是 8.0 版,而我所知道最新版本是 9.0 版。但是请大家一定要注意,这里的 8.0 版和 9.0 版不是指 MASM 编译器 ( 即 ML) 的版本,而是 MASM32 开发环境的版本。
那么MASM(ML) 编译器的版本到底有哪些呢?教学上常用的版本是 5.0 版的, 5.0 版之后有个 5.1 版本,在这之后,从 6.0 版开始 MASM 就改名ML了,因为它把编译和连接组合在一起了。而且 6.0 版还对汇编语言进行了大幅改造,使之支持高级语言的很多特性。 6.0 版之后常看到的就是 6.11 、6.13 、6.14 MASM32(V8.0 和 V9.0) 就是包含有 ML6.14 版 , 而不是 ML8.0 版。6.14 之后就是 6.15 但不常见 , 我手头上有 6.15 的 ML 。但 Microsoft 从 6.15 版开始好象就不再单独发布 MASM 的开发工具包了。

以后的 ML 还有 7.0 、7.1 版,最新的是 ML8.0 版。但它们都只包含在 Visual Studio.Net 和 Visual Studio 2005 里面。而且如果你 安装了 Visual Studio 2005 的 64 位开发环境,你将得到一个MASM for x64 ( ml64 .exe) 哈哈,各位这可是支持 Intel 和 AMD 的 64 位 CPU 的汇编语言编译器!有志于 64 位底层开发的赶快去试用看看吧。

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 ,可读性和可维护性提高了很多
MASM 6.00A 未发售的版本
MASM 6.00B 最后一个支持 OS/2 的 MASM 版本,修正了上一版本中的一些错误
MASM 6.10 修正了一些错误,同时增加了 /Sc 选项,可以在产生的 list 文件中列出每条指令使用的时钟周期数
MASM 6.10A 1992 年发布,修正了一些内存管理方面的问题
MASM 6.11 1993 年 11 月发布,支持 Windows NT ,可以编写 Win32 程序,同时支持 Pentium 指令,但不支持 MMX 指令集
MASM 6.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 2000 年 4 月发布

nasm fasm yasm

这三个都是免费开源的汇编编译器,总体上都是采用的Intel的语法。yasm是从nasm的基础上开发出来的,属于同宗,使用了相同的语法,所以nasm的代码可以用yasm编译。
yasm虽然更新较慢,但对nasm一些不合理的地方进行了改良。从这个角度来看,yasm比nasm更优秀些,而nasm更新快,能支持更新的指令集,而且还支持Gas语法和AMD64(EM64T)架构,跨平台,支持多种目标文件格式。在Windows平台上,fasm是另一个不错的选择,平台支持比较好,可以直接用来开发Windows上的程序,语法也比较独特。在对Windows程序结构的支持上,fasm是3个免费的编译器里做得最好的。
yasm的官方地址:http://yasm.tortall.net/Download.html。使用很简单:将下载下来的yasm-1.2.0-win32.exe重命名为yasm.exe,放到D:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录下即可。
nasm的官方地址:http://www.nasm.us/
nasm支持在Linux平台上使用intel格式的汇编

  1. nasm -f elf -o write.o write.S
  2. ld -m elf_i386 -s -o write.bin write.o

会出现报错

  1. ld: i386 architecture of input file `write.o' is incompatible with i386:x86-64 output

原因是Linux平台系统是64位的,在x86_64上编译/链接32位应用程序时,设置模拟以elf_i386提供正确的elf格式。

  1. ld -m elf_i386 -s -o write.bin write.o

gas

Gas即GNU assembler 是linux下的汇编编译器,使用的AT&T的语法

  1. .file "hello.s\n"
  2. .section .rodata
  3. msg:.string "hello,world!\n"
  4. len=.-msg
  5. .section .text
  6. .global _start
  7. _start:
  8. movl $len,%edx
  9. movl $msg,%ecx
  10. movl $1,%ebx
  11. movl $4,%eax
  12. int $0x80
  13. movl $0,%ebx
  14. movl $1,%eax
  15. int $0x80
  16. ret

Ml.exe的用法
不同版本的MASM在使用上有很大的不同,本节所指的是可用于win32汇编编程的MASM6.14以上的版本,MASM编译器的命令用法如下:
image.png
要注意的是汇编选项要集中写在源文件名的前面,例如:

例1:
image.png
例2:
image.png

虽然他们都可以编译成Test.asm文件,但第二句的/Cp选项由于写在了源文件名的后面,实际上被忽略了。另外多个选项之间一定要加空格。
Ml在win32汇编编程中常用的选项如表2.2所示。
image.png

与用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的命令使用方法为:
image.png
命令行参数中的文件列表用来列出所有需要链接到可执行文件中的模块,可以指定多个obj文件和res资源文件以及到入库文件。Link的选项如下所示。
image.png

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

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

如下例子:
image.png

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

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

//在link过程中如果出现找不到库的情况则/libpath:xxx(库目录)即可。

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

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

](https://blog.csdn.net/paradox_1_0/article/details/90142870)