3、主存寻址
主存寻址是所有计算机中都普遍采用的一类寻址方式,其寻址种类也最为复杂。主存寻址的指令格式主要有:
OPC M
OPC M, M
OPC M, M, M
主存寻址方式主要包括直接寻址方式、间接寻址方式和变址寻址方式等三种类型。
直接寻址方式是在指令中直接给出参加运算的操作数及运算结果所存放的主存地址,即在指令中直接给出有效地址。在早期生产的计算机及目前的某些专用计算机中用得比较多。随着主存储器容量的不断扩大及虚拟存储器的普及,这种寻址方式暴露出了许多致命的弱点。首先,它需要很长的地址码,特别在二地址及三地址指令中,这一矛盾更为突出。通常的小型及微型计算机,表示一个主存地址要二进制30位左右,因此,有限长度的指令无法容纳如此长的地址码。其次,为了实现程序循环及高效处理数组运算等,程序设计中修改数据的地址是必不可少的。采用直接寻址方式编写的程序,如果要修改数据地址就必须修改程序中的指令本身,采用这种方法编写的程序没有再入性,这是现代程序设计思想所不能接受的。另外,目前使用的操作系统多为多任务或多用户系统,采用直接寻址方式编写的程序会给操作系统的作业调度带来极大的不便,因为,多任务及多用户操作系统要求程序能够在主存中浮动,所以,必需要有其它寻址方式来支持。
间接寻址方式在指令中给出的是操作数地址的地址,必须经过两次或两次以上的访问主存储器操作才能得到操作数。间接寻址可以只进行一次,也可以连续进行多次。多数计算机采用一次间接寻址方式,这种间接寻址方式只要用指令中给出的地址码去访问主存储器,就能直接得到操作数的有效地址。采用多级间址时,第一次间址的标志由指令给出,以后各次的间址标志要由紧接着访问主存储器所取出来的地址码给出,如果取出的地址码的间址标志位(通常指定最高位)为"1",则要用除去标志位后的部分作为地址码继续访问主存储器,直至取出来的地址码的间址标志位为"0"时为止,这时,除去间址标志位之后的地址码即为有效地址。通常划出主存储器最低端的一小部分存放间接地址,因此,采用间接寻址方式时,指令中需要表示的地址码的长度可以很短。另外,也可以用寄存器来存放间接地址,这样,指令中需要表示的地址码的长度就更短。
采用变址寻址方式时,需要设置一个或多个变址寄存器。变址寄存器的长度由主存储器的寻址空间决定,例如,主存储器的寻址空间为4GB,则变址寄存器的长度需要32位。也可以把某一个或几个通用寄存器兼作变址寄存器来使用。变址寄存器的主要作用是用来存放数组的基地址。
在指令中给出变址寄存器的编号(如果只有一个变址寄存器,可以隐含)和地址的偏移量。当指令在执行时,用一个硬件的加法器,把变址寄存器中给出的基地址与指令中给出的地址偏移量作算术加法,相加的结果就是有效地址。
另外,变址寻址还有两种特殊的形式。一种是相对寻址方式,当变址寄存器就是程序计数器本身时称为相对寻址方式。采用相对寻址方式编写的程序本身就具有浮动性,称成为与位置无关代码(PIC码),这为程序的连接装配及在主存中的浮动调度提供了极大的分便。另一种是为了支持程序动态重定位的基址寻址方式,实际上,它也是一种变址寻址方式。在有些计算机系统(如IBM公司生产的大型中型计算机)中,既有变址寻址方式,又有基址寻址方式,这时,在指令执行过程中,对于每一个操作数都要进行两次变址运算,即做两次加法运算才能得到操作数的地址。