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