2.2.3 寻址方式
寻找操作数及数据存储单元的方法称为寻址方式。在"汇编语言程序设计"和"计算机组成原理"等课程中我们已经学习了寻址方式的基本原理,本课程主要从计算机体系结构的角度介绍寻址方式的设计思想和设计方法。
主要的寻址方式有如下几种类型:
1、立即数寻址
直接在指令的地址码部分给出操作数,这种寻址方式的优点是:不需要数据存储单元,指令的执行速度快。缺点是:只能用于源操作数寻址,数据的长度不能太长,大量使用立即数寻址方式会使程序的通用性下降。立即数寻址方式通常仅仅用来指定一些精度要求不高的整型常数。
2、寄存器寻址
指令在执行过程中所需要的操作数来源于寄存器,运算结果也写回到寄存器中,这种寻址方式在所有的RISC计算机及大部分的CISC计算机中得到广泛应用。目前,在一般处理机中通常都有几十个,甚至几百个至几千个寄存器。
寄存器寻址方式的指令格式主要有:
OPC R
OPC R, R
OPC R, R, R
OPC R, M
前三种分别是一地址、二地址和三地址寄存器寻址指令,其中的三地址指令主要用于向量处理机和VLIW处理机中。第四种指令在RISC计算机中只允许LOAD和STORE指令是使用,而在CISC计算机中,一般的运算指令也可以使用这种形式。
对于输入输出指令和一些特殊的处理机控制指令,指令中所给出的寄存器可能是设备的控制寄存器、状态寄存器和处理机的程序计数器、堆栈指针、状态字寄存器等。
寄存器寻址方式的优点主要有:
(1)指令字长短。由于通用寄存器的数量一般只有几十个,在指令中只需很少几位就能表示一个操作数的地址。例如,在IBM370系列计算机中,有16个通用寄存器,只要用4个二进制位就能表示一个操作数的地址,即使是三地址指令,也只要12位地址码。
由于通用寄存器的字长可以比较长(多为32位、64位等),在采用寄存器间址寻址方式时,在通用寄存器中可以存放字长很长的主存地址。对于数据字长为64位的计算机系统,在一个通用寄存器中不仅可以存放一个字长很长的主存地址,还可以同时存放地址的偏移量及各种标志等其它许多信息。
(2)指令执行速度快。由于寄存器的速度很快,与主存储器相比,访问时间几乎可以忽略不计,因此,大多数寄存器型指令都能在一个节拍内完成。
对于那些要连续使用的数据,把它们存放在通用寄存器中,能够大幅度提高程序的执行速度。这里要特别指出的是:对于用得最为普遍得二地址指令,必须要有通用寄存器的支持,否则,程序的执行速度将明显下降。关于这一点,在指令系统一节中还要作详细的分析。
(3)支持向量、矩阵运算。当通用寄存器的数量比较多时,可以把一个向量或向量的一部分放在通用寄存器内,从而提高运算速度。
寄存器寻址方式也有明显的缺点,主要有:
(1)不利于优化编译。由于通用寄存器的速度与主存储器相比要快得多,因此,通用寄存器分配得是否合理,直接影响到程序的执行速度。通常要把那些连续使用或用得比较频繁的变量分配在通用寄存器中,这就给编译器的优化设计造成了很大的困难。这说明,通用寄存器型机器不适应高级语言的数据模型。
另外,通用寄存器的不对称性也对优化编译带来很大的麻烦。例如,在IBM370系列机中规定:R0寄存器不能作变址寄存器和基址寄存器使用,对于双字长指令只能用编号是偶数的通用寄存器等。在小型计算机PDP-11中,限制就更多:R0用于宏调用,隐含存放返回值,R5在高级语言与汇编语言连接时使用,R6兼作堆栈指针,R7兼作程序计数器,R0至R5可兼作变址寄存器,对于双字长指令也只能用编号是偶数的寄存器等。
(2)现场切换困难。在程序运行过程中,当发生调用、中断、分时切换等情况时,要把有关通用寄存器中内容都保存到主存储器中,在程序返回时,再全部恢复这些通用寄存器中的内容。通用寄存器的数量越多,保存和恢复所需要的时间就越长。
为了解决这一问题,目前的多数处理机都设置有两套或两套以上的通常寄存器,程序员只能看到其中的一套通用寄存器,当发生现场切换时,硬件自动切换到另一套通用寄存器。例如,美国SUN公司的SPARC处理机,设置有8套通用寄存器,采用重叠寄存器窗口技术,程序员能够看到的32个通用寄存器分成三个部分:局部寄存器、与上层调用连接的寄存器和与下层调用连接的寄存器,在与上层调用连接的寄存器中存放由上层调用带给本层的变量,在与下层连接的寄存器中存放本层调用传送给下一层调用的变量,最后一层的与下层连接寄存器和第一层的与上层连接寄存器完全重叠。
(3)硬件复杂。一方面,在处理机中设置大量的通用寄存器,包括程序员看见的寄存器及更多的程序员不看见的寄存器,需要增加硬件,另一方面,这些寄存器的读、写及现场切换等的控制也相当复杂,例如,一个有8个功能部件的超标量处理机,在一个节拍中需要从通用寄存器中读出16个操作数,写回8个运算结果,可见其译码控制逻辑是相当复杂的。