2.2.4 间接寻址与变址寻址
对于数组运算,通常要用一个循环程序对数组中的各个元素进行操作,这时必须通过修改操作数的地址才能实现。间接寻址方式与变址寻址方式的设计目标都是为了解决操作数地址的修改问题。它们都能做到,在程序设计过程中能够对操作数的地址进行修改,而不必去修改程序中的指令本身。
原则上,在一台计算机系统中,仅需设置间址寻址方式与变址寻址方式中的任何一种即可,如在IBM公司生产的大中型计算机系统中,只有变址寻址方式,没有间址寻址方式。在许多小型及微型计算机系统中,只有间址寻址方式,没有变址寻址方式。也有一些计算机系统,间址寻址方式和变址寻址方式两种都有。
那么,就会提出这样一个问题:在设计一台计算机系统时,如何选取间址寻址方式与变址寻址方式?下面,我们通过一个简单的例子,分析这两种寻址方式的区别及各自的优点及缺点。
例2.3:一个由N个元素组成的数组,已经存放在主存储器的连续存储单元中,现要把它搬到主存储器的另一个连续的存储单元中,源数组的起始地址为AS,目标数组的起始地址是AD,不必考虑可能出现的存储单元的重叠问题。为了编程简单,采用一般的两地址指令编写程序。
首先,用间接寻址方式编写程序如下:
START: MOVE ASR, ASI ;保存源数组的起始地址,为了程序具有在入性
MOVE ADR, ADI ;保存目标数组的起始地址
MOVE NUM, CNT ;保存数据的个数
LOOP: MOVE @ASI, @ADI ;用间址寻址方式传送数据
INC ASI ;源数组的地址增量
INC ADI ;目标数组的地址增量
DEC CNT ;个数减1
BGT LOOP ;测试N个数据是否传送完
HALT ;停机
ASR: AS ;源数组的起始地址
ADR: AD ;目标数组的起始地址
NUM: N ;需要传送的数据个数
ASI: 0 ;当前正在传送的源数组地址
ADI: 0 ;当前正在传送的源数组地址
CNT: 0 ;剩余数据的个数
为了程序具有再入性,前3条指令是必须的,数据存放单元要分别重复设置一份也是必须的。
然后,用变址寻址方式编写程序如下:
START: MOVE AS, X ;把源数组的起始地址送入变址寄存器
MOVE NUM, CNT ;保存数据个数,为了程序具有再入性
LOOP: MOVE (X), AD-AS(X) ;AD-AS为地址偏移量,在汇编时计算
INC X ;增量变址寄存器
DEC CNT ;个数减1
BGT LOOP ;测试N个数据是否传送完成
HALT ;停机
NUM: N ;需要传送的数据个数
CNT: 0 ;剩余数据的个数