为x86程序员提供另一种汇编器

Netwide Assembler,简称NASM,由西蒙·泰瑟姆和朱利安·霍尔开发,是把x86汇编语言源文件转换为机器代码或目标文件的工具。早期发行包同时提供反汇编程序NDISASM,两者共享指令表,分别处理文字指令到机器码、机器码到文字指令的方向。

早期手册把项目的起点追溯到网络新闻组上的讨论。开发者希望得到免费、可移植、语法便于人工书写的x86汇编器。他们关心的不只是处理指令,还包括不同操作系统的输出格式和程序员编写代码时的便利。

参考:[1] [2]

1996年10月的0.90版本

NASM保存下来的早期更新日志把0.90记为1996年10月发布,并称其为首个发布版本。这次加入了目标文件输出;日志还提到更早的0.3系列,说明公开发行前已有持续实现和修改的过程。

1996年11月的0.91继续扩展,增加RDF格式、调试输出、微软OBJ格式的32位扩展和MMX指令支持,也改善了DOS环境下的内存处理。首发与这些后续能力有明确的版本界线。

参考:[3]

发行包中的跨平台协作

到1997年的0.97发行包,用户可以取得DOS、Win32命令行程序以及Unix环境所需的源码。Readme列出微软、Borland、Symantec、Watcom和DJGPP等工具链的构建文件,反映出同一程序适配多种开发环境的努力。

这些适配也记录了具体贡献者:福克斯·卡特提供Borland构建文件,马克·容克提供Symantec相关文件,多米尼克·贝尔贡献Watcom与DJGPP支持。开发工作通过源码、补丁和构建说明在网络上协作,而不是围绕某一种厂商的单一开发套件展开。

发行包还附有LCC编译器的机器描述文件,让NASM可以参与C程序的代码生成流程。它既服务直接写汇编的程序员,也能成为其他语言工具链的一环。

参考:[1]

从源文件到目标文件

用户手册给出的基本操作是选定输出格式,再交给NASM一个源文件。例如nasm -f elf myfile.asm把源文件汇编为ELF目标文件;选择bin并指定输出名,则生成平坦二进制文件。格式决定后续工具怎样理解其中的代码和数据。

手册还提供清单文件选项,把生成的十六进制机器码与原始源行排列在一起。程序员由此可以检查某段文字最终对应哪些字节。NASM的作用是完成汇编转换;采用目标文件的工作流程通常还需要链接器,把其他模块和库结合成可运行程序。

参考:[2] [4]

一个读取两个整数并求和的例子

保罗·卡特2003年的《PC Assembly Language》用NASM编写first.asm,提示用户输入两个整数,再打印总和。示例把提示字符串放在.data节,为两个输入在.bss节保留空间,把执行指令放在.text节。

程序调用输入例程后,将数值保存到input1和input2。随后把第一个数装入EAX寄存器,用ADD加上第二个数,再把结果交给输出例程。输入输出由教材配套例程及C库协作完成,汇编部分清楚展示数据在内存与寄存器之间的移动。

教材还说明,DJGPP环境使用COFF目标文件,Linux例子使用ELF,并须配合不同的符号命名约定。同样的计算任务移到另一个环境时,需要核对目标格式与调用接口。

参考:[4]

在修订中形成可用的工具

1997年4月的0.94版本加入宏处理器,7月的0.95又增加源代码清单支持;11月的0.96把Unix源码包改为自动配置形式。宏、清单与构建支持让重复代码、机器码检查和安装工作逐步方便起来。

同一更新日志也保存了大量修正记录,包括目标文件、符号、表达式及预处理行为。NASM的早期发展既有新增功能,也有使已有功能可靠工作的持续修补。到卡特编写教材时,它已成为书中跨平台汇编练习使用的基础工具。

参考:[3] [4]