版权归原作者所有,如有侵权,请联系我们

[科普中国]-源带交叉汇编程序

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

交叉汇编程序的演变过程

教学计算机的交叉汇编程序有好几个不同的版本,最早的版本是用PC的汇编语言实现的,只用于16位字长的TEC-2教学机,后来又用高级语言PASCAL分别实现了8位和16位的TEC一2000教学计算机的交叉汇编程序。

为了提高教学计算机交叉汇编器(包括16位和8位版本)的功能和性能,同时兼顾易用性,有必要对其进行一些改进,使之更加符合TH—union+教学计算机系统的应用。

两种汇编器合二为一原有的16位、8位汇编器的源代码大同小异,不同之处主要在于对具体指令的分析和机器码生成的操作上。同时维护两套大体相同的源程序代码显然降低了软件维护工作的效率,因为无论是修正一个错误,还是添加一个新的功能,都必须对两套代码分别做出修改。

为了解决这个问题,新版本的汇编器将原16位、8位版本合并到了一起,既能汇编16位代码,又能汇编8位代码。用户通过选项告诉汇编器要生成哪一种机器语言代码。为了实现这种功能,要将两套源代码合并,并添加一个名为Generate8BitCode的全局布尔变量。这个变量的值为true时表示汇编8位代码,否则为16位代码。在程序中需要根据生成的目标代码是16位还是8位而执行不同的程序段时,就根据这个变量的值来判断。

汇编语言功能更趋完备(1)直接支持扩展指令集。

原有的16位、8位两种汇编器均只支持基本指令,若要汇编其中包含拓展指令的程序,只能通过编写指令扩展定义文件来达到目的。考虑到最新的TH-union+教学计算机的16位和8位版本的微程序(或组合逻辑)控制部件已将所有的扩展指令完整地实现,并且许多扩展指令对于编写某些具备较复杂功能的汇编程序是必需的,因此有必要在汇编器中增加对扩展指令的支持。

新版本汇编器提供了一个选项,使用这个选项时,可以直接汇编包含扩展指令的文件,否则汇编器只提供对基本指令的支持。为了支持对指令的进一步扩展,汇编器仍然提供对指令扩展定义文件的支持。新的程序中指令集的初始化方式由逐条赋值改为从指令集常量数组复制,共有16位基本、16位扩展、8位基本、8位扩展共4个指令集常量数组,程序根据用户选项决定是复制16位还是8位的指令集常量数组,或是复制扩展指令集常量数组。如果用户指定了指令扩展定义文件,程序将解析这个文件,并将新定义的指令记录信息添加到指令集中。

另外,新版本汇编器允许同一机器码的指令有多个不同的别名,比如16位汇编的“进位则跳转”指令可以写作JRC或JC。为了实现这个功能,程序中不再严格检查指令集中各指令记录的机器码是否重复,只要指令名称不重复就可以了。

(2)一条新的伪指令一一include。

在使用汇编语言编写教学计算机的监控程序时,发现有些常量定义常为多个源代码模块所共用,所以实现监控程序的程序员们就将常量定义存放在单独的文件中,并利用MS—DOS的COPY命令将常量定义文件和源代码文件合并成一个临时文件进行汇编。

从c语言的#include预处理指令得到启发。#include的作用就是把指定文件的全部内容复制到当前源文件的#include位置处。与此相仿,新版本汇编器增加了一条伪指令——include,作用与C语言的#include完全一样。这条伪指令的功能是这样实现的:原来的汇编器程序中只有一个用来读取源文件的文件变量,而新的程序中变成了可包含多个文件变量的文件变量栈(用SrcFiles数组实现)。汇编开始时栈中只有一个元素,即用户指定的源文件。程序中需要读一行汇编语句时,就从栈顶的文件中读取。如果读到的是include伪指令,则向栈中压入一个文件变量元素(即include后跟的文件名所指定的文件),而成为新的栈顶。如果栈顶的文件读到了末尾,则相应的变量元素(被include的文件)出栈,原来次栈顶的元素成为新的栈顶,以后程序中需要读一行汇编语句时就从相应的include语句之后的一行读起。所有元素都出栈,意味着用户指定的汇编程序文件全部扫描完毕。

文件变量栈的容量设为8,意味着include可以有7层嵌套,这对一般应用绰绰有余。对于汇编过程中发现的包含文件中的语法错误,为了方便用户查找错误的位置,汇编器应给出栈中各个文件当前行的号码。所以行号计数器也不再是一个全局变量,而是栈中每个文件变量元素都有一个行号计数器。程序每次读一行汇编语句,只有栈顶元素的行号计数器才加1。这样显示语法错误信息时就能将源文件的包含关系和各自的当前行号列出来了。 .

(3)其他语言方面的改进。

新版本汇编器对符号长度的限定由8个字符改为16个,这样用户定义的符号名可以更准确地反映该符号所代表的含义。按照目前多数计算机语言的习惯,符号名中允许使用下划线,并且允许将下划线作为符号的第一个字符。

新版本汇编器还提供了一个选项,用于生成不带头信息(即值为1的起始字节、2个字节的装入地址和2个字节的长度)的.cod文件,以满足汇编监控程序时的特殊需求。

性能和易用性的改进(1)提高汇编速度。

在原版本汇编器的源代码中,当调用RowScan或RowAsm等函数时,指令集数组和寄存器集数组是直接作为值参数传递的,这在Turbo Pascal中意味着复制整个数组,每汇编一条语句,这种参数传递就至少要进行一次,给汇编效率带来了较大的负面影响。另外,原版本的代码中有些过程模块的实现算法不够优化,有的地方没有充分利用TurboPascal语言的功能(比如较低级的位操作)。

在新版本汇编器的源代码中,指令集数组和寄存器集数组作为变量参数来传递,提高了传递效率,还改进了某些模块的实现算法,充分利用了Turbo Pascal语言的扩展功能。经过这些调整,汇编速度有了较大提高。

(2)对用户界面的调整。

原版本汇编器运行时需要用户较多的干预,例如询问目标文件、列表文件、指令扩展定义文件的文件名。新版本的汇编器将用户所有的输入信息都集中到了命令行中,并且如前所述,还定义了若干汇编选项。所以对汇编器源代码中读取命令行参数的部分进行了重新编写。

对原版本中个别错误的修正原8位版本汇编器中,在汇编3字节指令时将地址的高8位放在指令的第2个字节,低8位放在指令的第3个字节,而TEC2000实验机的规定正好与此相反。新版本汇编器修改为与实验机一致,低位字节在前,高位字节在后。

新版本汇编器还纠正了原版本源代码中有关符号链表算法中的不当之处,以避免指针错误发生,使对符号链表的检索和更新操作更为可靠。

另外,对代码的书写风格也做了全面的修改,新的书写格式完全符合Borland公司的推荐标准,有利于代码的维护。2

命令行格式TEC交叉汇编器的运行文件为teca.exe,命令行参数的格式为:

teca[选项]源文件名[目标文件名[列表文件名]][选项]

选项选项参数包括了7种选项,分别是一2、一8、一e、一g、一i、一v和一x(大小写均可)。

一2表示源文件是以前的TEC-2实验机的汇编语言代码,并要求生成TEC一2的机器码。

一8表示源文件是TEC2000机8位平台汇编语言代码,并要求生成8位平台的机器码。

一e表示源文件中允许包含教学计算机16位或8位平台的默认扩展指令。如果不使用该选项,则只支持基本指令。TEC一2机没有预留默认扩展指令,所以用户同时使用一2和一e选项时,一e选项没有效果。

一g表示生成的目标文件没有文件头,即没有值为1的起始字节、2字节的起始地址和2字节的代码长度。该选项用来满足一些特定需求(如汇编监控程序)。如果不使用这个选项,则声称的目标文件包含文件头。

一i表示使用指令扩展定义文件,即为指令扩展定义文件的文件名。如果文件名中无扩展名,汇编器认为扩展名为ins。文件名必须紧跟字母i,中间不能有空格或其他符号。不使用该选项表示不使用指令扩展定义文件。

一v表示显示汇编器的版本和版权信息。

一X表示源文件是TH-union+教学计算机16位平台汇编语言代码,并要求生成16位平台的机器码。这个选项是默认选项,即当命令行中一2、一8和一x这3个选项全都没有出现时,汇编器认为用户选择TH—union+教学计算机系统16位平台。

在一个命令行中,用户可以使用上述选项中的一个或多个,但对于一2、一8和一X这3个选项只能使用其中一个。如果同时使用多个选项,各个选项之间以空格分隔,如一8一e。也可以采用紧凑的书写格式,即只用一个“一”号,之后紧跟多个选项字母,如一8e;但采用这种书写方法时,如果使用了一i选项,一i选项只能是最后一个选项,如一eiext.ins。

用户可以不使用任何选项,表示完全采用默认设置汇编。

文件名源文件名是指汇编语言代码的文件名,目标文件名是指汇编器生成的机器语言代码的文件名,列表文件名是指记录源程序以及标号、变量和存储地址等信息的列表文件的文件名。这3个文件名在命令行中必须按上述次序排列,不能颠倒。文件名可以使用绝对路径或相对路径。

源文件名不能省略。如果源文件名无扩展名,对于16位平台(即不使用一8选项),汇编器认为扩展名为asm;对于8位平台(即使用一8选项),汇编器认为扩展名为src。

当列表文件名省略时,目标文件名也可以省略。目标文件名还可以写作星号“*”。目标文件名省略或写作星号时,汇编器认为其路径、基本文件名与源文件名相同,唯扩展名改为cod。如果目标文件名无扩展名,汇编器认为扩展名为cod。

列表文件名可以省略,表示不生成列表文件。列表文件名也可以写作星号,汇编器认为其路径、基本文件名与源文件名相同,唯扩展名改为1st。如果用户列表文件名写作“con”,则只在标准输出设备产生列表文件。如果列表文件名无扩展名,汇编器认为扩展名为cod。2