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


    目录

    一、操作数的存放位置

    二、常见寻址方式

    1. 立即寻址

    2. 主存直接寻址

    3. 寄存器直接寻址

    4. 主存间接寻址

    5. 寄存器间接寻址

    6. 自减型寄存器间址

    7. 自增型寄存器间址

    8. 堆栈寻址

    9. 变址寻址

    10. 基址寻址

    11. 基址加变址寻址

    12. 相对寻址


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

    一、操作数的存放位置

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

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

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

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

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

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

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

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

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

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

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

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

    二、常见寻址方式

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

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

    1. 立即寻址

    由指令直接给出操作数。常用来提供常数、设置初值等。

    ① 定长格式

    操作数在指令中的长度固定,从而其表示范围有限。

    ② 变长格式

    操作数在指令之后,长度可变。

    2. 主存直接寻址

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

    ① 定长格式

    ② 变长格式

    应用举例:

    操作数地址: EA = A

    操作数: S = (A)

    读取:A = 1002H  S = 0020H

    3. 寄存器直接寻址

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

    操作数地址:EA = R 

    操作数:S = (R)

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

    应用举例:

    4. 主存间接寻址

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

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

    应用举例:

    A = 1002H

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

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

    5. 寄存器间接寻址

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

    优点:

    • 寄存器编号所占位数少;
    • 同一条指令通过不断修改间址单元的内容就能实现对不同操作数的访问。

    注意:由于寄存器间接寻址仍然会访存,因此寻址速度不会提高。

    应用举例:

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

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

    6. 自减型寄存器间址

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

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

    应用举例:

    (R) = 1002H

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

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

    7. 自增型寄存器间址

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

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

    应用举例:

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

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

    (R) = 1002H + 1 = 1003H

    8. 堆栈寻址

    按照自底向上的生长方式,若向堆栈中压入数据,栈顶向上浮动;若从堆栈中弹出数据,栈顶向下浮动。改变操作码,就可以分别实现入栈和出栈的功能。

    隐含约定寻址方式:

    自底向上:

    9. 变址寻址

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

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

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

    (RX) 为位移量,D 为基准地址。

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

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

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

    10. 基址寻址

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

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

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

    (RB) 为基准地址,D 为偏移量。

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

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

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

    应用:程序的重定位

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

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

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

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

    11. 基址加变址寻址

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

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

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

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

    12. 相对寻址

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

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

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

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

    非相对寻址存在的缺点:

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

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

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

  • 相关阅读:
    Java23种设计模式之第三弹-工厂模式
    PDF Expert for mac(专业pdf编辑器)苹果电脑
    【云原生】SpringCloud系列之客户端负载均衡Ribbon
    Nacos 注册中心和配置管理的数据一致性
    美国ARC与延锋安全合作,推动汽车安全气囊技术新突破
    垃圾分类箱通过工业4G路由器实现无人值守远程管理
    JS-谈谈你所理解的闭包
    Vue之路由跳转,query传参,子路由,路由模式--hash&history,VueRouter router route三者区别区别
    基于tushare和mongo,玩转qlib自带的数据库
    Service详解
  • 原文地址:https://blog.csdn.net/m0_64140451/article/details/127057292