寻址方式的目的是用来找操作数的物理地址。由于指令中地址码的位数有限,因此不建议直接在地址码中存放操作数的物理地址(会导致内存中的很多空间表示不了)
指令寻址一般是通过程序计数器(PC)去累加寻找指令的地址,对于某些特殊情况而言,跳转指令的地址就需要和操作数寻址一样了。因此我们一般说的寻址是指操作数寻址
基本寻址方式分为立即数寻址、寄存器直接寻址、寄存器间接寻址、存储器直接寻址、存储器间接寻址、相对寻址(变址寻址)、堆栈寻址等
立即数寻址
立即数寻址是一种不需要寻址方式的寻址,其操作数直接在指令中给出(操作数只能是源操作数)
特点:
1.指令执行时间短,不需要访问内存
2.操作数的大小受地址字段长度的影响
立即数寻址只能作为双操作数指令的源操作数
寄存器直接寻址
寄存器直接寻址是一种操作数存放在寄存器中的寻址方式,该种方法指令地址字段中存放的是操作数所在的寄存器编号
特点:
1.无需访问内存,指令执行速度快
2.地址范围有限(能够使用的通用寄存器不多)
3.只需要很短的地址字段
4.使用最多的一种寻址方式
寄存器间接寻址
存储器间接寻址是一种操作数存放在存储器中,操作数地址存放在寄存器的寻址方式,该种方法指令地址字段存放的是一个在寄存器中的地址,该地址指向操作数在存储器中的真正地址。至少需要访问一次内存才能取到操作数。
特点:寻址空间大,使用普遍
比存储器间接寻址少访问一次存储器
存储器直接寻址
存储器直接寻址是一种操作数存放在存储器的寻址方式,该种方法指令地址字段中存放的是操作数在存储器中的地址
其寻址空间受指令的地址字段长度的限制
存储器间接寻址
存储器间接寻址是一种操作数和操作数地址都存放在存储器中的寻址方式,该种方法指令地址字段中存放的是一个在存储器中的地址,该地址指向操作数在存储器中的真正地址。因此至少需要两次访问内存才能取到操作数。第一次先取到操作数在存储器中的地址,第二次再去该地址取出操作数。
特点:
需要两次访问内存,指令执行速度较慢
扩大了可以使用的寻址空间
偏移寻址
偏移寻址中需要存放一个地址和一个偏移量。根据存放地址的不同可将偏移寻址划分为相对寻址、基址寻址、变址寻址
相对寻址
相对寻址中存放的地址是当前指令处的地址,偏移量表示相对于当前指令的偏移量。用EA=(PC)+A
基址寻址
基址寻址中存放的地址是一个基址(在程序执行过程中不变),偏移量表示相对于基址位置的偏移量。用EA=(B)+A
变址寻址
变址寻址中存放的地址是一个形式地址(I),偏移量表示相对于形式地址的偏移量。用EA=(I)+A。
基址寻址和变址寻址的区别
1.对于一道程序,基址是不变的,而变址寻址中形式地址给出的是一个存储器地址基准,形式地址是可变的
2.基址寻址中,偏移量位数较短,而变址寻址中偏移量足以表示整个存储空间
3.基址寻址立足于面向系统给,主要是解决程序逻辑空间于存储器物理空间的无关性,而变址寻址立足于用户
4.基址寻址方式适合解决动态定位的问题,而变址寻址适合解决循环问题
堆栈寻址
堆栈寻址方式的地址是隐含的,在指令中不必给出操作数的地址,因此,指令的长度很短,一般的形式有:
OPC
OPC M
前一种是标准的采用堆栈寻址方式的指令,参加运算所需要的操作数从堆栈顶端弹出,如果需要两个或多个操作数,则依次从堆栈顶端弹出,运算结果压入堆栈顶端。
后一种堆栈指令在RISC计算机中仅仅用来在栈顶与其他主存储器单元之间交换数据,在CISC计算机中也可以用于运算指令,指令所需要的一个操作数来自于主存储器,其它操作数从栈顶弹出,运算结果压入栈顶。