指令寻址方式(重点记忆)

目录

一、操作数的存放位置

1、操作数被包含在该指令之中,或存放在紧跟着指令的存储单元之中。

2、操作数存放在CPU的某个寄存器之中。

3、操作数存放在主存中,指令应以某种方式给出主存单元的地址码。 

4、操作数存放在堆栈中,可以隐含约定由堆栈指针SP提供地址。

5、操作数存放在某个I/O接口的寄存器中。

二、常见寻址方式

1、立即寻址

2、主存直接寻址

3、寄存器直接寻址

4、主存间接寻址

5、寄存器间接寻址

6、自减型寄存器间址

7、自增型寄存器间址

8、堆栈寻址

9、变址寻址

10、基址寻址

11、基址加变址寻址

12、相对寻址


  • 寻址就是指按某种规则形成操作数的有效地址
  • 我们把产生操作数有效地址的方式称为寻址方式

一、操作数的存放位置

  • 操作数被包含在该指令之中,或存放在紧跟着指令的存储单元之中。
  • 操作数存放在CPU的某个寄存器之中。
  • 操作数存放在主存中,指令应以某种方式给出主存单元的地址码。 
  • 操作数存放在堆栈中,可以隐含约定由堆栈指针SP提供地址。
  • 操作数存放在某个I/O接口的寄存器中。

1、操作数被包含在该指令之中,或存放在紧跟着指令的存储单元之中。

指令寻址方式(重点记忆)_第1张图片

可变字长指令:将操作码放在指令的第1个字节,读出操作码后就可以马上判定,这是一条单操作数指令还是一条双操作数指令,或者是零地址指令,从而知道后面还应该读取几字节指令代码。

森塞:操作码占固定长度;对操作数的长度没有限制,我们根据操作码确定操作数的长度。

2、操作数存放在CPU的某个寄存器之中。

指令寻址方式(重点记忆)_第2张图片

以前的寄存器是用D触发器做的,现在一般是用高速内存(Cache)做的。

3、操作数存放在主存中,指令应以某种方式给出主存单元的地址码。 

指令寻址方式(重点记忆)_第3张图片

4、操作数存放在堆栈中,可以隐含约定由堆栈指针SP提供地址。

指令寻址方式(重点记忆)_第4张图片

  • 硬堆栈:由SP寄存器来提供栈顶地址
  • 软堆栈:由通用寄存器来提供栈顶地址

堆栈在主存中;主存中划分有不同的存储空间。

5、操作数存放在某个I/O接口的寄存器中。

指令寻址方式(重点记忆)_第5张图片

接口控制器,简称接口,是系统总线与I/O总线通信的桥梁。简单来说,接口就是个协议转换单元,将系统的读写命令转换为I/O的收发命令。

  • 控制寄存器:用来容纳 CPU 传给接口的各种控制信息,控制信息决定了接口的工作方式。
  • 数据寄存器:用来暂存系统待发的数据或者从外部设备接收来的数据。
  • 状态寄存器:用来存放外部设备此时的状态,比如打印机的“忙”与“闲”。

二、常见寻址方式

指令寻址方式(重点记忆)_第6张图片

根据地址码字段——给定条件 A 和形成方式 Mode ——直接得到操作数或者得到操作数的有效地址 EA。

因为机器指令的二进制码冗长,所以在汇编语言中,我们使用助记符号来描述机器指令。

1、立即寻址

由指令直接给出操作数。

指令寻址方式(重点记忆)_第7张图片

这种寻址方式常用来提供常数、设置初值等。

2、主存直接寻址

指令中直接给出操作数的有效地址,根据该地址从主存中读取或写入操作数。 

指令寻址方式(重点记忆)_第8张图片

操作数地址: EA = A

操作数: S = (A)

读取:A = 1002H  S = 0020H

3、寄存器直接寻址

指令中直接给出寄存器号,操作数实际存储在指定编号的寄存器中。 

指令寻址方式(重点记忆)_第9张图片

操作数地址:EA = R 

操作数:S = (R)

优点:比访问主存快;能有效地缩短指令长度。

4、主存间接寻址

指令中给出主存间址单元的地址 —— 操作数地址的地址。

指令寻址方式(重点记忆)_第10张图片

A = 1002H

操作数地址:EA = (A) = 1020H

操作数:S = ((A)) = 8000H

作用:同一条指令通过不断修改间址单元的内容就能实现对不同操作数的访问。

5、寄存器间接寻址

指令中给出寄存器编号,指定的寄存器中存放的是操作数的有效地址。

指令寻址方式(重点记忆)_第11张图片

操作数地址:EA = (R) = 1002H

操作数:S = ((R)) = 0020H

优点:比访问主存快;寄存器编号所占位数少。

作用:同一条指令通过不断修改间址单元的内容就能实现对不同操作数的访问。

6、自减型寄存器间址

指令中给出寄存器编号,指定的寄存器的内容先减 1 ,再作为操作数的有效地址进行访存。 

指令寻址方式(重点记忆)_第12张图片

先 (R) = (R) - 1,后为操作数地址 EA

(R) = 1002H

操作数地址:(R) = 1002H - 1 = 1001H

操作数:S = (-(R)) = 0010H

7、自增型寄存器间址

指令中给出寄存器编号,寄存器的内容为操作数的有效地址,执行完访存后,寄存器的内容自动加 1 。 

指令寻址方式(重点记忆)_第13张图片

(R) 先作为操作数地址 EA,后 (R) = (R) + 1

操作数地址:EA = (R) = 1001H

操作数:S = ((R)) = 0010H

(R) = 1001H + 1 = 1002H

8、堆栈寻址

按照自底向上的生长方式,若向堆栈中压入数据,栈顶向上浮动;若从堆栈中弹出数据,栈顶向下浮动。 

指令寻址方式(重点记忆)_第14张图片

改变操作码,就可以分别实现入栈和出栈的功能。

9、变址寻址

指令中分别给出一个寄存器编号和一个形式地址:

  • 寄存器中的内容作为位移量
  • 形式地址作为基准地址

将基准地址和位移量相加得到操作数的有效地址。 

指令寻址方式(重点记忆)_第15张图片

操作数地址:EA = (RX) + D

操作数:S = ((RX) + D)

缺点:D的位数有限,  若不能提供全字长地址码,会使访存空间受到限制。

10、基址寻址

指令中分别给出一个寄存器编号和一个形式地址:

  • 寄存器中的内容作为基准地址
  • 形式地址作为位移量

将基准地址与位移量相加作为操作数的有效地址。 

指令寻址方式(重点记忆)_第16张图片

操作数地址:EA = (RB) + D

操作数:S = ((RB) + D) 

优点:可由基址寄存器提供全字长地址码,再由指令给出一个位数较短的偏移量,两者配合足够覆盖主存的任何区域。

应用:程序的重定位

用户编程时使用的是一种与实际主存地址无关的逻辑地址,将来运行时再自动转换为操作系统分配给它的主存地址(物理地址),即程序重定位。

在实现程序重定位时由操作系统给用户程序分配一个基准地址,并将它装入基址寄存器,在执行程序时就可以自动映射成实际的主存地址。

变址寻址与基址寻址的区别:

  • 变址: 面向用户,指令提供基准量,变址寄存器提供修改量(可变);适于处理一维数组。
  • 基址: 面向系统,指令提供位移量,基址寄存器提供基准量(固定);用于扩大有限字长指令的访存空间和程序重定位。 

11、基址加变址寻址

指令中给出一个基址寄存器编号RB、一个变址寄存器编号RX和一个形式地址D:

  • 基址寄存器的内容作为基准地址
  • 变址寄存器的内容作为变址量
  • 形式地址作为常规位移量

 指令寻址方式(重点记忆)_第17张图片

操作数地址:EA = (RB) + (RX) + D

操作数:S = ((RB) + (RX) + D)

 

12、相对寻址

程序计数器PC当前的内容作为基准地址,指令中给出的形式地址作为位移量,两者相加后形成操作数的有效地址。 位移量以补码的形式给出,可正可负,因此地址可以加也可以减。

指令寻址方式(重点记忆)_第18张图片

操作数地址:EA = (PC) ± D

操作数:S = ((PC) ± D) 

  • 相对寻址是基址寻址的一种特例
  • 相对寻址主要用于转移指令

非相对寻址存在的缺点:

指令寻址方式(重点记忆)_第19张图片

每次操作系统将程序加载到主存时,程序的起始地址(起始地址被送入到PC当中存放)一般不会和之前的起始地址一样。程序存放位置发生变化后,执行JMP 2000指令,我们仍会跳转到地址为2000的单元,将会导致错误结果。

转移地址按如下方式给出:

指令寻址方式(重点记忆)_第20张图片

虽然程序的存放地址发生变化,但是由于相对距离没变,所以程序仍可正确执行。

你可能感兴趣的:(计算机系统结构,jvm)