指令如何寻址
一、何为指令的寻址方式
- 指令的
寻址方式
是指寻找指令或操作数有效地址
的方式,也就是确定本条指令的数据地址
和下一条待执行指令的地址
的方式。寻址分为指令寻址
和数据寻址
。 - 指令中的
地址码字段并不代表操作数的真实地址,这种地址称为形式地址 (A),形式地址结合寻址方式可以计算出操作数在存储器中的真实地址,这种地址称为有效地址 (EA)
。 - (A) 表示地址为 A 的数值,A 既可以是寄存器编号,也可以是内存地址;所以 (A) 可以是寄存器中的数值,也可以是内存单元中的数值。
EA=(A)
表示有效地址为地址 A 中的数值。
1、指令寻址
- 寻找下一条待执行的指令称为指令寻址,有
顺序寻址和跳跃寻址
两种方式。 - 1)顺序寻址:通过
程序计数器(PC)
加 1 (个指令字长),自动形成
下一条指令的地址。 - 2)跳跃寻址:
- 跳跃,指下一条指令的地址码
不由程序计数器给出,而由本条指令给出下一条指令地址
的计算方式。 - 是否跳跃可能受到状态寄存器和操作数的控制,跳跃到的地址分为绝对地址和相对地址,绝对地址指由标记符直接得到,
相对地址
指相对于当前指令地址的偏移量
;跳跃的结果是当前指令修改 PC 值,所以下一条指令仍是由 PC 给出。
2、数据寻址
- 寻找操作数地址称为数据寻址,由于数据寻址的方式多,所以通常在指令中设一个字段用于区别数据寻址方式,该字段称为寻址特征,因此通常指令的格式如下:
二、数据寻址
- 常见的数据寻址方式有:
隐含寻址、立即数寻址、直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、相对寻址、基址寻址、变址寻址和堆栈寻址
,共10
种方式。
1、隐含寻址
- 指的是指令中不明显给出操作数的地址,而是
隐含操作数的地址
。如单地址指令。
隐含寻址的优点是有利于缩短指令字长
,缺点是需增加存储操作数或隐含地址的硬件
。
2、立即数寻址
- 也叫立即寻址,该类型的指令的地址字段指出的不是操作数地址,而是
操作数本身,即立即数
,通常用补码表示。 - 优点是指令在
执行阶段无需访存
,指令执行时间缩短
;缺点是立即数的位数限制了数的范围
。
3、直接寻址
- 指指令中的地址字段给出的不是形式地址,而是操作数的
真实地址
,即EA=A
。 - 优点是简单,指令执行时
只需一次访存
,不需要专门计算操作数的地址;缺点就是 A 的位数限制了操作数的寻址范围,操作数的地址不易修改
。
4、间接寻址
- 指指令地址的
地址字段
给出的是操作数有效地址所在的存储单元的地址,即是操作数地址的地址
,EA=(A)。间接寻址可以是一次间接寻址,也可以是多次间接寻址。 - 优点是
扩大寻址范围
;缺点就是指令执行时需要多次访存
,由于访存速度慢,因此这种寻址方式不常用。
5、寄存器寻址
- 指指令中直接给出操作数所在的寄存器的编号,即
EA = Ri
。 - 寄存器寻址的优点是指令执行阶段
不访问主存,访问寄存器
,因此缩短指令字长
,提高执行速度;缺点是寄存器价格昂贵
,寄存器数量有限
。
6、寄存器间接寻址
- 指寄存器给出的不是操作数本身,而是操作数所在的主存单元的地址,即
EA=(Ri)
。 - 比一般间接寻址
速度快
,但在指令执行阶段需要访存
。
7、相对寻址
- 指把
程序计数器的内容加上指令格式种的形式地址形成操作数的有效地址,即 EA=(PC)+A
, - 其中
A
相对于当前指令地址的位移量
,可正可负,补码
表示,操作数寻址范围由 A 决定
。
优点是操作数的地址不是固定的,随 PC值变化而变化,且与指令地址之间总是相差一个固定值,因此利于程序浮动
;相对寻址广泛用于转移指令
。
8、基址寻址
- 指
将 CPU 种基址寄存器(BR)的内容加上指令格式种的形式地址 A 而形成操作数的有效地址
,即EA = (BR) + A
。基址寄存器可以是专用寄存器,也可以是通用寄存器。基址寄存器是面向操作系统的,其内容由操作系统或管理程序确定
,主要用于解决程序逻辑空间和存储器物理空间的无关性;在程序执行过程种,基址寄存器种的内容不变,形式地址可变
。采用通用寄存器作基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但内容仍由操作系统确定。 - 基址寻址的优点是
扩大寻址范围
,用户不必考虑自己的程序存于主存的哪个空间区域,利于多道程序设计,并可以用于编制浮动程序,但偏移量位数较短
。
9、变址寻址
- 指
有效地址 EA 等于指令字种的形式地址 A 与变址寄存器 IX 的内容之和,即 EA = (IX) + A
,寄存器的选择同基址寻址方式。变址寄存器是面向用户的,在程序执行过程种,变址寄存器种的内容可由用户改变,形式地址 A 不变,因此与上面的基址寻址方式相反,用寄存器的值作为偏移量,形式地址 A 作为基址
。 - 优点就是
扩大寻址范围
,适合编制循环程序
,偏移量位数足够表示整个存储空间。
- 基址寻址主要用于为
多道程序或数据分配存储空间
,变址寻址主要用于处理数组问题
。