计算机组成原理常见的寻址方式,计算机组成原理精讲( 二 )


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) 。

计算机组成原理常见的寻址方式,计算机组成原理精讲

文章插图
特点:可以扩大寻址范围(因为基址的位数可以设置为很长) 。BR的内容可由操作系统或者管理程序确定 。程序的执行期间,BR内容不变但是A的内容可变 。有利于多道程序的设计 。
9. 变址寻址(面向用户)
这种做法是,指定一个变址寄存器IX,有效地址等于A与寄存器IX的内容相加 。即EA = A +(IX) 。与上面的基址寻址的方法不同 , IX的内容可以随要求填入,IX既可以用专用的寄存器,又可以用通用寄存器 。用汇编指令可以表示为:
mov ax,200[si]过程如图:

计算机组成原理常见的寻址方式,计算机组成原理精讲

文章插图
变址寻址是一种被广泛采用的寻址方式 。最典型的应用就是将指令的地址码部分给出的地址A作为基准地址 , 而将变址寄存器中的内容作为修改量 。在遇到需要频繁修改操作数地址的操作时,无需修改指令 , 只要修改变址寄存器中的编址值即可 。
在编程中,可设A为数组首地址,不断修改寄存器的内容 , 便可以得到数组中的任一数据地址 。特别适合编制循环程序 。
10. 堆栈寻址
堆栈是存储器中按LIFO的方式管理的存储区,该存储区的读/写单元地址用一个特定的寄存器给出 , 该寄存器称为堆栈指针(SP) 。堆栈分为硬堆栈跟软堆栈两种 。寄存器堆栈称为硬堆栈 , 从主存中划出一段区域称为软堆栈 。
【计算机组成原理常见的寻址方式,计算机组成原理精讲】(这里注意sp一开始指向为空,所以在弹出的时候,先加1,因为有数据的时候才可以弹出 。)


推荐阅读