基址寻址
在介绍“基址寻址”之前,先要区分“逻辑地址”和“主存物理地址”两个概念。
“逻辑地址”是指程序员编写程序时使用的地址。“主存物理地址”是指程序段/数据段在主存中的实际存放地址。
程序段/数据段的“逻辑地址”都是从零开始编址的。而程序段/数据段每次装入主存的起始地址是不确定的,所以每次运行时,某条指令或者某个数据的“主存物理地址”也是不确定的。但是,这条指令或者这个数据的“逻辑地址”是固定的。
因此,可以在处理器内部设置一个专门存放程序段/数据段在主存中起始地址的寄存器。称起始地址为“基地址”,简称“基址”,称该寄存器为“基址寄存器”。这样,在指令中只需给出“逻辑地址(也叫形式地址)”,在执行时将“逻辑地址”与基址寄存器中的值相加即可得到指令或数据的“主存物理地址”,也叫有效地址E=(基址R)+A。
习惯上,称指令中给出的“逻辑地址”为相对于基址的“位移量”,位移量是一个带符号的整数,用补码表示。
变址寻址
变址寻址是为了支持用循环结构处理数组或向量而提出的。它所实现的逻辑基础是,用局部相对固定的程序代码 处理具有强逻辑关系的一组数据,有时也可以是一条指令循环处理批量数据。这组数据间的强逻辑关系,一般是从某个固定的地址开始,依次线性排列。而排列的起始地址就是数组或向量的首地址,可存于指令的地址码;线性排列中对应于不同数据的变量 i 存放在一个专门的寄存器——变址突破口中。指令执行时,用变址加法器将指令中的形式地址与变址寄存器中的内容相加,即可得到数组或向量元素的有效地址 E=(变址R)+A。
对数组或向量的访问既可能是顺序访问,也可能是随机访问。这样只需改变变址寄存器中的i值,就可以随机地访问数组或向量的任一个元素。
例如,要想采用循环结构来处理一个数组或向量的各个元素,那么循环体中的数据处理指令就可以采用“变址寻址”。只要在指令中给出数组或向量的起始地址,循环开始前将变址寄存器初始化为第一个或最后一个元素下标,每次处理结束后变址寄存器加1或减1。这样就可以用相同的指令来遍历处理数组或向量中的所有元素了。
相对寻址
相对寻址,是将程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。E=(PC)+A。