寻址方式概述
寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。
指令寻址
指令寻址方式有两种:一种是顺序寻址方式,另一种是跳跃寻址方式。
顺序寻址
由于指令地址在内存中按顺序存放,当执行一段程序时,通常是按一条指令接一条指令的顺序执行。这种程序顺序执行的过程,我们称为指令的 顺序寻址方式。为此,必须使用程序计数器 (PC Register) 来计数指令的顺序号,该顺序号就是指令在内存中的地址。
跳跃寻址
当程序转移执行的顺序时,指令的寻址就采取 跳跃寻址方式
。所谓跳跃,是指下条指令的地址码不是由程序计数器给出的,而是由本条指令给出。注意,程序跳跃后,按新的指令地址开始顺序执行。因此,指令计数器的内容也必须相应改变,以便及时跟踪新的指令地址。
采用指令跳跃寻址方式,可以实现程序转移或构成循环程序,从而能缩短程序长度,或将某些程序作为公共程序引用。指令系统中的各种条件转移或无条件转移指令,就是为了实现指令的跳跃寻址而设置的。
数据寻址
在指令 执行过程中,操作数的来源一般有三个:
- 由指令中的地址码部分直接给出操作数
- 将操作数存放在 CPU 内的通用数据寄存器中,这样速度快,但是寄存器存储空间有限。
- 更一般化的方式是将操作数存放在内存的数据区中。
而对于内存寻址,既可以在指令中直接给出操作数的实际访存地址,称为 有效地址()
,也可以在指令的地址字段给出所谓的 形式地址(),在指令执行时,将形式地址依据某种方式变换为有效地址再取操作数。
形成操作数的有效地址的方法,称为 操作数的寻址方式。
而指令有分为零地址指令、一地址指令、二地址指令、三地址指令等。以一地址指令和二地址指令为例,其指令结构如下:
立即寻址(Immediate Addressing)
指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。指令中的操作数称为立即数。立即寻址方式的特点是指令中包含的操作数立即可用,节省了访问内存的时间。
MOV R1, #3 ; 将数字 3 移动到寄存器 R1 中
立即寻址的优点是指令在执行阶段不访问主存, 指令执行时间最短; 缺点范围受限。
直接寻址(Direct Addressing)
直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址字段中直接指出操作数所在的内存地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为 直接寻址方式。即
注意 EA 是有效地址,并不是有效地址中的值。而是相当于一个指针,指向了这个有效地址。操作数的读取将从 EA 指向的地址中读取。
MOV A, 1000h ; 将内存地址 1000h 处的值加载到寄存器 A
间接寻址(Indirect Addressing)
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址。即
这里的括号 (A)
的含义是取出给定的形式地址 中的值。上面的式子的含义是,有效地址 等于 形式地址
中的 存储的地址。假如 中的存储的地址为 0x00001011
。这时候
MOV A, (R0) ; 将寄存器 R0 指向的地址处的值加载到寄存器 A
寄存器寻址(Register Addressing)
当操作数不在内存中,而是放在 CPU 的通用寄存器中时,可采用寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号。即
,其中操作数在由 所指的寄存器内。
MOV A, B ; 将寄存器 B 的值加载到寄存器 A