另外,对于变址寻址方式和间接寻址方式,还有以下几种特殊的寻址方式:
  4.多重间接寻址方式;
  按照指令中给出的地址A访问主存储器得到的不是有效地址EA,而是有效地址EA的地址。
  间接寻址可以只进行一次,也可以连续进行多次。多数计算机系统采用一次间接寻址方式,这种间接寻址方式只要用指令中给出的地址码去访问主存储器,就能直接得到操作数的有效地址。
  有效地址EA =((A))或 EA=@(A)
  采用多级间接寻址时,第一次间址的标志由指令给出,以后各次的间址标志要由紧接着访问主存储器所取出来的地址码给出。如果取出的地址码的间址标志位(通常指定最高位)为"1",则要用除去标志位后的部分作为地址码继续访问主存储器,直至取出来的地址码的间址标志位为"0"时为止,这时,除去间址标志位之后的地址码即为有效地址。
  通常划出主存储器最低端的一小部分存放间接地址,因此,采用间接寻址方式时,指令中需要表示的地址码的长度可以很短。另外,也可以用寄存器来存放间接地址,这样,指令中需要表示的地址码的长度就更短。
  变址寻址方式有两种特例,即相对寻址方式和基址寻址方式。
  5.相对寻址方式
  当变址寄存器就是程序计数器PC时称为相对寻址方式。
  有效地址EA =(PC)+ A
  采用相对寻址方式编写的程序本身就具有浮动性,称为位置无关代码(PIC码),因此,相对寻址方式为程序的连接装配及在主存中的浮动调度提供了极大的方便。
  6.基址寻址方式
  基址寻址方式是为支持程序动态重定位而设置的,实际上,它也是一种变址寻址方式,所不同的是:基址寻址方式中的变址寄存器是程序动态重定位时使用的基址寄存器。
  有效地址EA =(B)+ A;式中B为基址寄存器
  在有些计算机系统(如IBM公司生产的大型中型计算机)中,既有变址寻址方式,又有基址寻址方式,这时,在指令执行过程中,对于每一个操作数都要进行两次变址运算,即做两次加法运算才能得到操作数的地址。
  与寄存器间接寻址一样,在主存储器的间接寻址方式和变址寻址方式中也有自动增(减)寻址方式。
  7.自动变址
  从上面的例子中看到,无论采用间接寻址方式,还是采用变址寻址方式编写程序,对于数组运算,都必须有对地址进行增量的指令。在采用间接寻址方式编写的程序中,有两条指令分别对源数组和目标数组的地址指针进行增量。在采用变址寻址方式编写的程序中,有一条指令对变址寄存器进行增量。为了省去这些对地址进行增量的指令,在许多计算机系统中对于间接寻址方式和变址寻址方式都增加了自动变址的功能。
  上例中,对于采用间接寻址方式编写的程序,只要把指令:
      MOVE @AS, @ADG
改为:    MOVE (AS)+, (AD)+
紧接在下面的两条分别对AS和AD指针作增量的指令就可以省去。
  同样,在采用变址寻址方式编写的程序中,把指令:
      MOVE (X), AD-AS(X)
改为:   MOVE (X), AD-AS(X)+
紧接在下面的一条对变址寄存器作增量的指令就可以省去。
  地址增量的单位,要根据具体机器所采用的编址方式和数据元素的长度等关系来确定,例如,对于采用字节编址的机器,如果数据元素的长度是二进制16位,则增量单位是2,如果数据元素的长度是二进制32位,则增量单位是4。
  地址增量的先后关系也很有讲究,有如下几种方式:
  第一种,先用后增,先减后用方式。程序中的写法是:A(X)+,-A(X),或A(X++),A(--X)。这种方式多用于有后进先出堆栈,而且堆栈指针指向栈顶元素的计算机系统中。
  对于A(X)+,先计算有效地址EA =A+(X),然后使变址寄存器指向下一个地址X = X + d。其他自动变址方式,按类似的方法计算。
  第二种,先增后用与先用后减方式。程序中的写法是:+A(X),A(X)-,或A(++X),A(X--)。这种方式多用于有后进先出堆栈,而且堆栈指针指向栈顶第一个空元素的计算机系统中。
  第三种,先增后用与先减后用方式:程序中的写法是:+A(X),-A(X),或A(++X),A(--X)。这种方式多用于有没有后进先出堆栈的计算机系统中。
  对于间接寻址方式的自动变址,只要把上面的括号前的A去掉,括号中的X改为A。
  8.前变址与后变址
  在既有变址寻址方式,又有间接寻址方式的计算机系统中,先做变址运算还是先做间址运算,需要事先定义。有效地址EA的计算方法有如下两种:
  第一种,前变址寻址方式,有效地址的计算过程是:EA=((X)+A)。
  第二种,后变址寻址方式,有效地址的计算过程是:EA=(X)+(A)。
  变址寻址方式中的偏移量是带有符号的,通常用补码表示,这样,不仅可以有向前的偏移,也可以有向后的偏移。
  偏移量的长度一般短于基地址的长度,在做加法时,一定要把偏移量的符号扩展,直至与基地址的长度相同。例如,某机器的偏移量为二进制8位,有一个用16进制补码表示的偏移量F3,基地址为二进制16位,有一个用16进制表示的基地址05CD,正确的做法是:在做加法之前,首先要把偏移量的符号扩展8个二进位,成为FFFD,再与基地址相加,结果的有效地址是:05CD+FFF3=05C00。