|「计算机组成原理」:常见的指令寻址方式( 二 )

所以 , 通常用于给定的某一寄存器或者主存单元赋值 , 或者用于提供某一常数 。 换成C++代码可以看成:
1.int x = 100; 2.const int j = 100; 3.···3. 直接寻址
即地址码字段直接给出操作数所在的内存地址 , 即EA = A的情况 。 如下面的汇编指令:
mov ax [200]; 将地址为200处的数据 , 存放到ax中这种行为就像程序中直接给出变量名:
int y = x;
|「计算机组成原理」:常见的指令寻址方式
本文插图

优点:简单 , 执行阶段值访问一次内存 , 因此在早期的计算机中 , 常常作为主要的寻址方式 缺点:A的位数决定了该指令操作数的寻址范围 , 并且操作数的地址不易被修改 。
4. 间接寻址
间接寻址是相对直接寻址而言的 , 指令的地址字段不是操作数的真实地址 , 而是操作数的有效地址所在的存储单元的地址 , 听起来有点拗口 , 也就是操作数地址的地址 , 即EA = (A) , 间接寻址可以是一次间接寻址也可以是多次间接寻址 。 如果还是有点不好理解 , 那么用下图来理解(用间接寻址的方式取出788这个数):
|「计算机组成原理」:常见的指令寻址方式
本文插图

  • 优点:明明可以一步到位 , 为什么还有多此一举?显然 , 这种方式可以扩大寻址范围 , 将小地址作为一个跳板 , 可以访问更多的地址空间 , 便于编程(子程序中的返回) 。
  • 缺点:需要进行多次访存(一次的间接寻址就需要两次访存) 。 访问速度慢 。
5. 寄存器寻址
寄存器寻址是指的在指令中 , 直接给出操作数所在的寄存器编号 , 即EA = Ri 。 操作数在R的内部(类似于直接寻址) 。就像下面的汇编指令:
mov ax,bx
|「计算机组成原理」:常见的指令寻址方式
本文插图

  • 优点:指令执行时 , 不访问内存 , 只访问寄存器 , 指令字短 , 故执行速度快 , 支持向量/矩阵运算 。
  • 缺点:寄存器的价格昂贵 , 且计算机内寄存器的数量有限 。
6. 寄存器间接寻址
类似于间接寻址 , 寄存器中给出的不是一个操作数 , 而是操作数所在的主存单元的地址 , 即EA = Ri 。用汇编指令表示为;
mov ax,[bx]
|「计算机组成原理」:常见的指令寻址方式
本文插图

这种做法的主要特点就是 , 比间接寻址快 , 但是由于操作数在主存中 , 故仍需要访问内存 , 一般用于扩大寻址范围 。
7. 相对寻址
这种寻址方式的原理是基于程序的局部性原理 。 指令中的A , 加上PC上的内容 , 作为操作数的地址 。 即EA = (PC)+ A 。 其中A是相对于当前地址的偏移量 。 可正可负 。 用补码表示 。
特点:A的位数决定操作数的寻址范围 。 操作数不固定 , 随着PC的变化而变化 , 并与指令地址总差一个固定值 。 便于程序浮动 。 被广泛用于转移指令(即jump指令) 。这里注意理解PC指令的作用 。 比如下面的句子:
jump A
|「计算机组成原理」:常见的指令寻址方式
本文插图

CPU从存储器中取一个字节 , 即(PC)+1 ->PC.也就是说PC自增1.若此时 , 转移指令的地址为X , 且占2个字节 。 那么取出该指令后 , PC自增2 , 即(PC) = X + 2 。 执行完这个指令后 , 跳到X+2 + A处继续执行 。
8. 基址寻址(面向系统)
基址寻址 , 是将CPU中的基址寄存器(BR)的内容 , 加上指令格式中的形式地址A , 从而形成有效地址 。 即EA = A +(BR) 。
|「计算机组成原理」:常见的指令寻址方式


推荐阅读