1981年手册中的开发工具
微软宏汇编器后来广为人知的简称是MASM。1981年版权的《8086微处理器实用软件包参考手册》,使用的名称却是MACRO-86。该册由位于华盛顿州贝尔维尤的Microsoft, Inc.署名,面对8086、8088系统的汇编开发者,把汇编、连接与库管理安排在一套工作流程中。
产品文献和进入特定市场的时间各有记录。微软1987年的DOS历史附表,将面向MS-DOS环境引入宏汇编器、FORTRAN及COBOL编译器记在1982年2月至4月。1981手册说明早期工具的形态;这份公司回顾则记录DOS产品线扩展的阶段,并未给出一个可统一代表所有发行物的首发日。
开发者回忆与不同发行物
关于程序的编写者,研究者克里斯托夫·朗克吕德在2017年转录了蒂姆·帕特森的回忆:MASM由马克·麦克唐纳用Pascal编写,宏功能受到DEC汇编器的启发。这是一条有明确叙述者的回忆,补充了原手册只以公司署名的开发背景。
朗克吕德还实际比较了微软品牌M.EXE与IBM版MASM.EXE的启动代码,发现二者不同。相同的1.00编号未能抹平发行物的区别。研究早期实现时,品牌、文件与具体运行库都需要一并辨认,才可把某项技术现象归到正确的程序上。
参考:[4]
从源文件到可组合的模块
1981年软件包列出M86.EXE、LINK.EXE、LIB.EXE和CREF.EXE。汇编器把源语句变成可重定位的目标代码;MS-LINK负责连接模块,MS-LIB管理库中的模块,MS-CREF生成符号定义与引用位置的对照。这套分工让开发者可以分别处理源文件、目标模块和符号关系。
模块化解决的是反复修改大程序的负担:某个部分可先单独汇编,再与其他部分组合。宏则处理源代码内部的重复。宏定义中的形式参数在展开时被实际参数替换,生成普通指令;它所减少的是重复书写,而非自动把多次使用都变成一次共享的运行时代码。
参考:[1]
一个加倍子程序的写法
按该手册的MACRO、PROC、PUBLIC和SEGMENT语法,可以写成下面这个独立的可连接子程序模块。调用者通过AX传入数值,并以远调用进入TWICE;过程中的RET按FAR过程类型返回。它不包含独立启动入口或屏幕输出。
DOUBLE MACRO R ADD R,R ENDM CODE SEGMENT ASSUME CS:CODE PUBLIC TWICE TWICE PROC FAR DOUBLE AX RET TWICE ENDP CODE ENDS END
这里DOUBLE AX在汇编时展开为ADD AX,AX。若调用前AX为7,执行加法后就是14;宏名本身不成为处理器指令。PUBLIC让连接器能够把其他模块的引用接到TWICE,而FAR过程允许调用来自另一代码段。这个例子也区分了两种“调用”:宏调用发生在汇编时,子程序调用发生在程序运行时。
参考:[1]
IBM个人电脑上的分发形态
PCjs保存的IBM Macro Assembler 1.00分发盘目录,列有MASM.EXE和ASM.EXE,也带EXMP1M、EXMP2M等汇编源文件及批处理文件。它保存的不只是汇编器本体,还有示例和组织开发工作的辅助材料。微软品牌的1.00目录则属于重建磁盘,载体性质与IBM分发盘有所不同。
这一时期有多套8086汇编工具并行使用。内卡塞克在2018年的研究中指出,早期IBM个人电脑ROM BIOS使用Intel开发工具,DOS 1.x则使用帕特森的Seattle Computer Products汇编器ASM。MASM后来进入DOS与BIOS开发流程,不能由它后来的地位倒推所有初版系统都已用它生成。
二进制保存下来的实现细节
早期程序在后来的机器上运行,也会显露原有假设。朗克吕德与内卡塞克分别分析了Pascal启动代码中的有符号比较:可用内存达到某些范围时,计算可能被错误解释,造成报错或停滞。这些结论来自对具体文件的检查,并非“所有旧汇编器都有同一问题”。
因此,手册说明程序应该如何使用,分发物保存实际交付的文件,二进制研究又能揭示实现偏差。把三者结合,MASM的早期历史才既有宏与模块的设计,也有交付形式和实际运行的细节。它的后续版本扩展,应放回各自的处理器与开发环境中考察。