寻址方式就是处理器根据指令中给出的地址信息来寻找
有效地址的方式,是确定本条指令的数据地址以及下一条要执行的指令地址的方法。
简介
在
存储器中,操作数或
指令字写入或读出的方式,有地址指定方式、相联存储方式和
堆栈存取方式。几乎所有的计算机,在内存中都采用地址指定方式。当采用地址指定方式时,形成操作数或指令地址的方式称为寻址方式。寻址方式分为两类,即指令寻址方式和
数据寻址方式,前者比较简单,后者比较复杂。值得注意的是,在传统
方式设计的计算机中,内存中指令的寻址与数据的寻址是交替进行的。
寻址模式的数量
不同的计算机体系结构在硬件中提供的寻址模式数量上有很大差异。 消除复杂寻址模式并仅使用一个或几个更简单的寻址模式有一些好处,即使它需要一些额外的指令,也许还需要一个额外的寄存器。 如果只有一些简单的寻址模式,那么设计管流水线CPU将变得更为简单。
大多数RISC架构只有大约五种简单的寻址模式,而DECCAX等CISC架构有十几种寻址模式,其中一些非常复杂。 IBM System/360架构只有三种寻址模式,System/390又添加了一些。
当只有少数寻址模式时,所需的特定寻址模式通常在指令代码中编码(例如IBM System/360和后继者,还有大多数RISC)。 但是当存在许多寻址模式时,通常在指令中留出特定字段来指定寻址模式。 DEC VAX允许几乎所有指令有多个存储器操作数,因此保留每个操作数说明符的前几位以指示该特定操作数的寻址模式。 保持寻址模式指定符位与操作码操作位分离产生正交指令集 。
即使在具有许多寻址模式的计算机上,实际程序的测量表明下面列出的简单寻址模式占所有寻址模式的约90%或更多。 由于大多数此类测量基于编译器从高级语言生成的代码,因此这在某种程度上反映了所使用的编译器的局限性。
指令寻址
指令的寻址方式有以下两种。
顺序寻址方式
由于指令地址在内存中按顺序安排,当执行一段程序时,通常是一条指令接一条指令地顺序进行。也就是说,从存储器取出第1条指令,然后执行这条指令;接着从存储器取出第2条指令,
再执行第二条指令;接着再取出第3条指令。
这种程序
顺序执行的过程,称为指令的顺序寻址方式。为此,必须使用
程序计数器(又称指令计数器)PC来计数指令的顺序号,该顺序号就是指令在内存中的地址。
跳跃寻址方式
当
程序转移执行的顺序时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的
地址码不是由程序计数器给出,而是由本条指令给出。注意,程序跳跃后,按新的指令地址开始顺序执行。因此,程序计数器的内容也必须相应改变,以便及时跟踪新的指令地址。
采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。
指令系统中的各种条件转移或无条件
转移指令,就是为了实现指令的跳跃寻址而设置的。
注意是否跳跃可能受到
状态寄存器的操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和
相对地址(对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC
程序计数器的值,所以下一条指令仍是通过程序计数器PC给出。
操作数寻址
形成
操作数的有效地址的方法称为操作数的寻址方式。由于大型机、
小型机、
微型机和
单片机结构不同,从而形成了各种不同的操作数寻址方式。下面介绍一些比较典型又常用的操作数寻址方式。
隐含寻址
这种类型的指令,不是明显地给出操作数的地址。而是在指令中隐含着操作数的地址。例如,单地址的
指令格式,就不明显地在
地址字段中指出第2操作数的地址,而是规定累加寄存器AC作为第2操作数地址。指令格式明显指出的仅是第1操作数的地址D。因此,
累加寄存器AC对单地址指令格式来说是隐含地址。如:DAA ;
立即寻址
指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为
立即寻址。
立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。如:MOV AX,#5678H 注意:
立即数只能作为源操作数,不能作为目的操作数。
直接寻址
直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为
直接寻址方式。在指令中直接给出参与运算的操作数及运算结果所存放的
主存地址,即在指令中直接给出有效地址
间接寻址
间接寻址是相对直接寻址而言的,在间接寻址的情况下,指令地址字段中的
形式地址不是操作数的真正地址,而是操作数地址的
指示器,或者说此形式地址单元的内容才是操作数的有效地址。
寄存器寻址方式
当操作数不放在内存中,而是放在
CPU的
通用寄存器中时,可采用
寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址
单元号,而是通用寄存器的编号(可以是8位也可以是16位(AX,BX,CX,
DX))。指令结构中的RR型指令,就是采用寄存器寻址方式的例子。如:MOV
DS,AX
寄存器间接寻址方式与
寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。
相对寻址方式
相对寻址是把
程序计数器PC的内容加上指令格式中的形式地址D而形成操作数的有效地址。程序计数器的内容就是当前指令的地址。“相对”寻址,就是相对于当前的指令地址而言。采用
相对寻址方式的好处是程序员无须用指令的
绝对地址编程,因而所
编程序可以放在内存的任何地方。指令格式:MOV AX,[BX+1200H] 操作数
物理地址PA=(DS/SS)*16H+EA EA=(BX/BP/SI/DI)+(6/8)位
偏移量Disp 对于BX,SI,DI寄存器来说
段寄存器默认为DS,对于BP来说,段寄存器默认为SS
基址寻址方式
在
基址寻址方式中将CPU中的
基址寄存器的内容,加上
变址寄存器的内容而形成操作数的有效地址。基址寻址的优点是可以扩大寻址能力,因为与形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的
存储空间中寻址。
变址寻址方式
变址寻址方式与基址寻址方式计算有效地址的方法很相似,它把CPU中某个
变址寄存器的内容与偏移量D相加来形成操作数有效地址。
但使用变址寻址方式的目的不在于扩大
寻址空间,而在于实现程序块的规律变化。为此,必须使
变址寄存器的内容实现有规律的变化(如自增1、自减1、乘比例系数)而不改变指令本身,从而使有效地址按变址寄存器的内容实现有规律的变化。
块寻址方式
块寻址方式经常用在输入输出指令中,以实现
外存储器或外围设备同内存之间的
数据块传送。块寻址方式在内存中还可用于数据块移动。