• 指令的类型


    目录

    1. 传送类指令

    2. 输入/输出(I/O)类指令

    3. 算术逻辑运算类指令

    4. 程序控制类指令


    1. 传送类指令

    功能:将源地址里保存的数据传送到目的地址中保存,传送类指令一般常用助记符 MOV 表示。

    用户在编程中能够指定的源端和目的端:

    • 寄存器和寄存器之间
    • 寄存器和存储器之间
    • 存储器和存储器之间

    2. 输入/输出(I/O)类指令

    主机与外设之间交换信息:

     输入/输出(I/O)类指令实现主机和各外围设备之间的信息传输,输入和输出都以主机为参考点。

    • 将信息送入主机,称为输入。
    • 将信息送至外围设备,称为输出。

    外围设备通过 I/O 接口与系统总线连接,数据的发送/接收者是 I/O 接口中的寄存器,主机对外围设备的访问就是对有关接口寄存器的访问。

    主机用输出指令或传送指令,将具体设备的控制命令按约定的代码格式送往接口中的 控制寄存器,向外设发出命令。外设的状态信息以某种格式放在接口的 状态寄存器 中,主机用输入指令或传送指令从状态寄存器中取出有关信息进行查询、分析,以确定主机下一步的工作。主机与外设之间传输的数据存放于 数据寄存器。 

    系统总线与 I/O 接口的连接方式:

    先给出端口地址(你要用哪个寄存器),再给出控制信号(你是要读还是要写)。

    得到端口地址后,我们通过 译码器 来选择相应的寄存器:

    译码器的输出端与一个三态门相连,成为寄存器的控制端。当且仅当控制端有效时,才能从寄存器中读出数据。比如 A = 0,B = 0,C = 1,从第二个寄存器中读出数据。

    I/O 设备的编址方法:

    ① 单独编址

    早期方法是为每台设备分配一个设备码,I/O 指令中指明设备码和寄存器;常用方法是为每个寄存器(I/O 端口)分配独立的端口地址,I/O 指令中给出端口地址。

    例如,存储空间容量为 64K:

    • 主存编址:0000H ~ FFFFH
    • 端口编址:FF00H ~ FFFFH

    单独编址的特点:

    • 端口地址的数量远少于存储单元地址的数量
    • I/O 地址空间不占主存空间
    • I/O 地址可与主存地址重叠

    计算机不能根据地址码本身区分存储单元和 I/O 端口,即 I/O 接口寄存器。

    因此在处理器的指令集中,需要有专门的 I/O 指令(非数据传送指令)来完成端口的读写操作,又称为 显式 I/O 指令

    1. IN R, n1 ; 输入指令,将n1单元内容送入R中
    2. OUT n2, R ; 输出指令,将R内容送入n2单元中

    处理器通过对操作码 INOUT 的译码来判断出是 I/O 指令。对于主存,我们使用操作码 MOV 来完成输入/输出操作。

    逻辑电路如图所示:

    ② 统一编址

    I/O 端口地址占 CPU 提供的全部地址空间的其中一部分。

    比如,可将地址空间的低端部分分配给主存单元,高端部分分配给 I/O 端口,以示区分。

    采用统一编址,计算机可根据地址码本身区分是存储单元地址还是 I/O 端口地址,无需其它控制,对存储单元或 I/O 端口的读写不会发生混乱。

    统一编址时,将设备接口中的寄存器视为一个存储单元,采用 一般数据传送指令 实现 I/O 操作,又称为 隐式 I/O 指令

    在指令集中,无需专门的输入/输出指令,采用一般数据传送指令即可进行端口的读写操作:

    1. ; 数据寄存器地址为FF00H
    2. ; 命令寄存器地址为FF01H
    3. ; 状态寄存器地址为FF02H
    4. MOV [FF01H], R0 ; 将R0中内容送入命令寄存器中
    5. MOV R1, [FF02H] ; 将状态寄存器中内容送入R1中
    6. MOV R2, [FF00H] ; 将数据寄存器中内容送入R2中
    7. MOV [FFOOH], R3 ; 将R3中内容送入数据寄存器中

    处理器无需专门的信号来区分是访问存储器还是访问 I/O 端口,译码电路对地址码的译码即可区分出是读写存储器单元还是读写 I/O 端口。

    3. 算术逻辑运算类指令

    ① 算术运算指令

    加(ADD)、减(SUB)、乘(MUL)、除(DIV)、求补(NEG)、加1(INC)、减1(DEC)、…

    ② 逻辑运算指令

    与(AND)、或(OR)、非(COM)、异或(EOR)、…

    实现对代码位的设置、测试、清除、修改等。

    运算结束后大部分会自动设置相应状态标志。 

    4. 程序控制类指令

    ① 转移指令

    • 无条件转移:操作码  转移地址
    • 条件转移:操作码  转移地址  转移条件

    ② 转子指令与返回指令

    • 转子指令:操作码  子程序入口
    • 返回指令:操作码

    子程序就是我们常说的函数,每个子程序的最后一条指令都是返回指令。以 C 语言为例,对于有返回值的函数,我们会在最后写上 return ... 进行返回;对于没有返回值的函数,在最后也会隐藏一条 return ; 进行返回。

    在高级语言中,函数名就是子程序的入口地址,我们假设这里的 Add 是一个函数名。取完 Add 指令,PC + n,PC 指向下一条指令,再把 PC 压入堆栈中。在 Add 执行结束后,再把 PC 弹出来。

    ③ 软中断指令

    早期主要用于程序调试,现在常用于系统功能调用。 

    和转子指令与返回指令的区别:软中断指令具有随机性,比如我们可以随机设置程序断点。

    ④ 控制指令

    •  CLC 清除进位标志
    •  NOP 空操作指令
    •  HLT 暂停指令
    • ...


    CPU内部结构:

  • 相关阅读:
    深度学习中图像格式选用jpg还是png?答:png
    Tecplot绘制三维彩色流线
    Spring Boot 2.x系列【14】功能篇之@Conditional注解
    嵌入式复习
    前序中序、中序后序以及前序后序构造二叉树
    元音三要素及元音图
    黑马全套Java教程(十):网络编程
    基于Redis的简易延时队列
    OLED根据数据手册显示一条直线
    Qt信号量用于对共享资源进行同步
  • 原文地址:https://blog.csdn.net/m0_64140451/article/details/127102883