|
知识路径: > 计算机系统基础知识 > 计算机软件基础知识 > 程序设计语言和语言处理程序知识 > 汇编、编译、解释系统的基本知识和基本工作原理 > 程序语言翻译基础 > 汇编程序基本原理 >
|
相关知识点:2个
|
|
|
|
汇编程序的功能是将汇编语言所编写的源程序翻译成机器指令程序。汇编程序的基本工作包括将每一条可执行汇编语句转换成对应的机器指令;处理源程序中出现的伪指令。由于汇编指令中,形成操作数地址的部分可能出现后面才会定义的符号,所以汇编程序一般需要两次扫描源程序才能完成翻译过程。
|
|
|
第一次扫描的主要工作是定义符号的值并创建一个符号表ST,ST记录了汇编时所遇到的符号的值。另外,有一个固定的机器指令表MOT1,其中记录了每条机器指令的记忆码和指令的长度。在汇编程序翻译源程序的过程中,为了计算各汇编语句标号的地址,需要设立一个位置计数器或单元地址计数器LC(Location Counter),其初值一般为0。在扫描源程序时,每处理完一条机器指令或与存储分配有关的伪指令(如定义常数语句、定义储存语句),LC的值就增加相应的长度。这样,在汇编过程中,LC的内容就是下一条被汇编的指令的偏移地址。若正在汇编的语句是有标号的,则该标号的值就取LC的当前值。
|
|
|
此外,在第一次扫描中,还需要对与定义符号值有关的伪指令进行处理。为了叙述方便,不妨设立伪指令表POT1。POT1表的每一个元素只有两个域:伪指令助记符和相应的子程序入口。下面的步骤(1)~(5)描述了汇编程序第一次扫描源程序的过程。
|
|
|
|
|
|
|
if(当前语句有标号)则将标号和单元计数器LC的当前值填入符号表ST;
|
|
|
if(当前语句是可执行的汇编指令语句)则查找MOT1表获得当前指令的长度K,并令LC=LC+K;
|
|
|
if(当前指令是伪指令)则查找POT1表并调用相应的子程序;
|
|
|
if(当前指令的操作码是非法记忆码)则调用出错处理子程序;
|
|
|
|
|
|
第二次扫描的任务是产生目标程序。除了使用前一次扫描所生成的符号表ST外,还要使用机器指令表MOT2,该表中有机器指令助记符、机器指令的二进制操作码(binary-code)、格式(type)和长度(length)等。此外,还要设立一个伪指令表POT2,供第二次扫描时使用。POT2的每一元素仍有两个域:伪指令记忆码和相应的子程序入口。与第一次扫描的不同之处是:在第二次扫描中,伪指令有着完全不同的处理。
|
|
|
在第二次扫描中,可执行汇编语句应被翻译成对应的二进制代码机器指令。这一过程涉及两个方面的工作:一是把机器指令助记符转换成二进制机器指令操作码,这可通过查找MOT2表来实现;二是求出操作数区各操作数的值(用二进制表示)。在此基础上,就可以装配出用二进制代码表示的机器指令。从求值的角度看,第二部分工作并不复杂。由于形成操作数地址的各个部分都以表达式的形式出现,只要定义一个过程eval-expr(index,value),其功能是通过index给定一个表达式在汇编语句缓冲区S的开始位置,该过程就用value返回此表达式的值。例如,虚拟计算机COMET的机器指令可归属于X型指令,其汇编语句为:
|
|
|
|
可以写出下面处理X型指令的程序段(假定index已指向操作数在缓冲区S的首地址):
|
|
|
|
类似地,可以写出其他类型指令处理操作数的程序段。设当前可执行汇编语句的操作助记符在MOT2表的索引值为i,则整个可执行汇编语句的处理可以描述如下:
|
|
|
|
在第二次扫描中,根据伪指令助记符,调用POT2表相应元素所规定的子程序。例如,DS伪指令的主要目的是预留存储空间。不妨设一个工作单元K(初值为0),用于累计以字节为单位的存储空间大小。从DS伪指令的操作数区求出K的大小后,就向输出区送K个空格以达到保留所规定存储单元的目的。DC伪指令处理的结果是向输出区送出转换得到的常量。开始伪指令工作是输出目标程序开始的标准信息,而结束伪指令则是输出目标程序结束的标准信息,这些信息都是为装配程序提供的。
|
|
|