6.变址寻址(Indexed Addressing)
程序设计的很多场合都需要操作数地址按某种规律变化,以增加寻址的灵活性。指令中指定一个寄存器作为变址寄存器,并在指令地址码部分给出一个形式地址,变址寄存器的内容(称为变址值)与形式地址相加后的结果作为操作数的地址,这种寻址方式称为变址寻址。顺便说明一点,有些地方将只使用变址寄存器的内容作为操作数的地址称为变址寻址;若不但使用变址寄存器,同时与形式地址相加,则称为相对变址寻址。变址寻址过程如图2.15所示。
变址寻址的典型用法是将指令中的形式地址作为基准地址,而变址寄存器的内容作为修改量。
在某些计算机中,变址寄存器还具有自动增量和减量的功能,即每存取一个数据,它就根据这个数据的长度(所占字节数)自动增量或减量,以便指向存放下一个数据的主存单元地址,为存取下一个数据做准备。这就形成了自动变址方式,它可以进一步简化程序,常用在需要连续修改地址的场合。它相当于一种复合类指令,其执行时间取决于所处理数据量的多少。
变址寻址通常用于字符串处理和数组运算等成批数据处理中。变址还可以与间址结合起来使用,形成先变址后间址或先间址后变址等更为复杂的寻址方式。
7,页面寻址(Page Addressing)
页面寻址是将整个主存空间划分为若干相等的区,每个区为一页,由页面号寄存器存放页面地址(内存高地址)。指令中的形式地址给出的是操作数存放单元在页内的地址(内存低地址),相当于页内位移量。将页面号寄存器内容(内存高地址)与指令给出的形式地址(内存低地址)相拼接从而形成操作数的有效地址,这种寻址方式称为页面寻址。
将页面寄存器与形式地址通过简单的拼装连接就可得到有效地址,不需进行计算,同时也解决了有限的地址码长度与大的主存容量之间的矛盾。它的另一优点是适于组织程序模块,并易于实现页面保护。
8.基址寻址(Based Addressing)
基址寻址原是大型计算机经常采用的一种技术,用来将用户的逻辑地址(用户编程时所使用的地址)转换成主存的物理地址(程序在主存中的实际地址)。在多用户计算机系统中,由操作系统为多道程序分配主存空间。当用户程序装入主存时,就需进行逻辑地址到物理地址的变换,即程序重定位。操作系统给每个用户程序一个基地址并放入相应的基址寄存器中,在程序执行时以基址为基准自动进行从逻辑地址到物理地址的变换。
由于多数程序在一段时间内往往只访问有限的一个存储区,这被称为“程序执行的局部性”。可利用这个特点缩短指令中地址字段的长度。设置一个基址寄存器存放这一区域的首址,而在指令中给出以首址为基准的位移量,两者之和为操作数的有效地址。基址寄存器的字长应足以指向整个主存空间,而位移量只需覆盖本区域即可。显然,利用基址寻址方式,既能缩短指令的地址字段长度,又可以扩大寻址空间。
基址寻址中,操作数的有效地址等于指令中形式地址与基址寄存器内容之和,即
EA=(Rb)+D
其中Rb为基址寄存器,D为形式地址(这里表示位移量)。
基址寻址与变址寻址在形式上和操作数地址的形成方式上都十分相似。但在编程习惯上,使用变址寻址时,由变址寄存器提供修改量,指令中形式地址作为基准地址:而基址寻址时,由基址寄存器提供基准地址,指令中形式地址作为位移量(其位数往往较短)。在应用场合中,基址寻址面向系统,可用来解决程序在主存中的重定位和扩大寻址空间等问题。而变址寻址却面向用户,用于访问字符串、向量和数组等成批数据。
但在某些小型、微型机中,基址寻址与变址寻址的界限往往是模糊的。
9.其他寻址
除了以上寻址方式外,还有位寻址、块寻址和堆栈寻址等。
位寻址指能寻址到位。这就要求对存储器不单按字节编址,还要按位编址。一般计算机是通过专门的位操作指令实现的,即采用隐式,由操作码OP隐含指明进行的是位操作。
块寻址是对连续的数据块进行寻址,对于连续存放的数据进行相同的操作。使用块寻址能有效压缩程序长度,加快程序的执行。块寻址必须指明块的首址和块长度,或者指明块首址和末址。
堆栈寻址使用堆栈指令对堆栈进行操作时,堆栈指令中的一个操作数地址是由堆栈指针SP隐含指定的,这种寻址方式称为堆栈寻址。SP总是指向栈顶元素,对栈顶元素操作完后,SP的值会及时修改以指向新的栈顶元素。
至此,已介绍了一些基本的寻址方式。对一台具体的机器而言,它可能只采用其中的一些寻址方式,也可能将上述基本寻址方式稍加变化形成某个新的变种,或者将两种或几种基本寻址方式相结合,形成某种特定的寻址方式。