寻址范围怎么算(单通信方式)


关于操作数的寻址方式,即CPU如何根据指令来查找真实的数据,或者如何表示指令中的操作数的真实地址。

寻址方式是指寻找指令或操作数的有效地址的方式。也就是确定本条指令的数据地址以及下一条指令将要执行的指令地址的方法。指令中的地址字段并不代表操作数的真实地址,这些地址字段被称为形式地址(A)。结合寻址方式,可以计算出操作数在存储系统中的真实地址,称为有效地址(EA)。对于符号(A),整个内容表示的是地址为A的数值。A可以是寄存器的标号,也可以是内存地址,因此(A)对应的是地址A的数值。例如EA =(A),可以表示为有效地址为地址A的数值

寻址方式分为指令寻址和数据寻址两大类。寻找下一条要执行的指令地址称为指令寻址,而寻找操作数的地址称为数据寻址。

指令寻址

  1. 顺序寻址 程序的指令序列在主存中顺序存放,程序执行时,从第一条指令开始逐条执行。这种程序的顺序执行称为顺序寻址方式。为了实现顺序寻址,CPU中必须有一个程序计数器(PC),用于计数指令的顺序号。PC开始时存放程序的首地址,每执行一条指令,PC+1,以指明下一条指令所在内存的地址,直到程序结束。
  2. 跳跃寻址 程序出现分支或循环时,执行顺序发生改变,此时采用跳跃寻址方式。所谓跳跃,即下条指令的地址不是由当前PC的值给出的,而是由指令本身给出的。跳跃方式是修改PC的内容,然后进入取指阶段(也就是说,下一条指令的地址仍由PC给出,但值已被修改)。

数据寻址 数据的寻址方式多样,过程是将操作数的形式地址变换为操作数的有效地址。通常数据寻址的指令格式如下:

通常指令字长等于存储字长等于机器字长。

操作数存放的位置不同,衍生出各种不同的寻址方式。一般情况下,操作数位于:

  • 指令中
  • CPU的某一寄存器中
  • 主存储器中
  • I/O设备的端口中

1. 隐含寻址

这种类型的指令中,操作数的地址并不明显给出,而是在指令中隐含着操作数的地址,特别是单地址指令就是这种情况(例如利用ACC作为第二操作数的地址,因此累加器ACC对单地址指令格式来说是隐含地址)。

优点:利于缩短指令字长,可以简化地址结构,是获取操作数的最快方式。

缺点:需要增加存储操作数的硬件或隐含地址的硬件。

2. 立即寻址

这种类型的指令中,地址字段即操作数本身,因此也称为立即数寻址。数据以补码形式存放。看下面的汇编代码,分号后面是注释:

表示将2308H这个地址移动到ax寄存器中,因此给出的地址是操作数本身。

  • 优点:在取指令的时候,操作码和操作数被同时取出,不需再次访存,提高了指令的执行速度。
  • 缺点:因为操作数包含在指令的一部分,所以不能被修改,而且对于固定长度的指令格式,操作数大小将受到长度的限制。

一般用于给定的某一寄存器或主存单元赋值,或者用于提供某一常数。在C++代码中可以看做:

3. 直接寻址

即地址码字段直接给出操作数所在的内存地址,即EA = A的情况。如下面的汇编指令:

这种行为就像程序中直接给出变量名:

优点:简单,执行阶段只需访问一次内存,因此在早期计算机中常作为主要的寻址方式。缺点:A的位数决定了该指令操作数的寻址范围,并且操作数的地址不易被修改。

4. 间接寻址

相对于直接寻址,指令的地址字段不是操作数的真实地址,而是操作数的有效地址所在存储单元的地址。也就是操作数地址的地址,即EA = (A),间接寻址可以是一次间接寻址或多次间接寻址。如果有些难以理解,可以通过下图来从间接寻址的方式获取788这个数:

  • 优点:可直接获取目标地址,可以作为跳板访问更多的地址空间,便于编程(子程序返回)。
  • 缺点:需要进行多次访存(一次间接寻址需要两次访存)。访问速度慢。

5. 寄存器寻址

寄存器寻址指的是在指令中直接给出操作数所在的寄存器编号,即EA = Ri。操作数在寄存器的内部(类似于直接寻址)。就像下面的汇编指令:

  • 优点:在指令执行时,只需访问寄存器而不是内存,指令字节短,因此执行速度较快,支持向量/矩阵运算。
  • 缺点:寄存器昂贵,计算机内寄存器数量有限。

6. 寄存器间接寻址

类似于间接寻址,但寄存器中给出的不是操作数而是操作数所在主存单元的地址,即EA = Ri。 用汇编指令表示为:

这种方式相比间接寻址更快,但因操作数在主存中,仍需要访问内存,通常用于扩大寻址范围。

7. 相对寻址

基于程序的局部性原理,相对寻址的原理是A加上PC的内容作为操作数的地址,即EA = (PC)+ A。A是相对于当前地址的偏移量,可以是正数或负数,用补码表示。

特点:A的位数决定操作数的寻址范围,操作数随着PC的变化而变化,与指令地址总差一个固定值,便于程序浮动。广泛用于转移指令(例如jump指令)。 这里注意理解PC指令的作用。例如下面的句子:

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既可以用专用的寄存器,又可以用通用寄存器。用汇编指令可以表示为:

过程如图:

变址寻址是一种被广泛采用的寻址方式。最典型的应用就是将指令的地址码部分给出的地址A作为基准地址,而将变址寄存器中的内容作为修改量。在遇到需要频繁修改操作数地址的操作时,无需修改指令,只要修改变址寄存器中的编址值即可。

在编程中,可设A为数组首地址,不断修改寄存器的内容,便可以得到数组中的任一数据地址。特别适合编制循环程序。

10. 堆栈寻址

堆栈是存储器中按LIFO的方式管理的存储区,该存储区的读/写单元地址用一个特定的寄存器给出,该寄存器称为堆栈指针(SP)。堆栈分为硬堆栈跟软堆栈两种。 寄存器堆栈称为硬堆栈,从主存中划出一段区域称为软堆栈。

(这里注意sp一开始指向为空,所以在弹出的时候,先加1,因为有数据的时候才可以弹出。)