Skip to content

3.4 指令类型

本节根据指令的功能,对指令系统中的指令进行分类。

3.4.1 数据传送类指令

这类指令用于在寄存器之间、寄存器与主存之间、主存单元之间传送数据。

  • 一般传送指令 (MOV, LOAD, STORE):

    • LOAD (取数): 将主存中的数据加载到寄存器。 MEM -> REG
    • STORE (存数): 将寄存器中的数据存储到主存。 REG -> MEM
    • MOV (移动): 在寄存器之间或寄存器与主存之间传送数据。
  • 堆栈操作指令 (PUSH, POP):

    • PUSH: 数据进栈。
    • POP: 数据出栈。
  • 数据交换指令 (XCHG): 交换两个操作数(寄存器或内存单元)的内容。

数据传送指令特点

  • 不改变操作数: 源操作数在传送后内容不变(除了交换指令)
  • 影响标志位: 某些传送指令可能影响标志寄存器的状态位
  • 寻址方式多样: 可以使用各种寻址方式来指定源和目标

3.4.2 运算类指令

这类指令用于执行算术运算和逻辑运算。

1. 算术运算指令

  • 基本运算:

    • ADD, SUB, MUL, DIV (加、减、乘、除)。
    • INC, DEC (加1、减1)。
    • NEG (取负): 求操作数的二进制补码。
  • 比较指令:

    • CMP (比较): 比较两个操作数,结果不保存,但会影响标志寄存器中的状态标志位。
    • 实际执行减法运算,但不保存结果,只设置标志位。
  • 多精度运算:

    • ADC (带进位加): 加法时包含进位标志CF。
    • SBB (带借位减): 减法时包含借位标志CF。
    • 用于实现超过机器字长的大数运算。

2. 逻辑运算指令

  • 基本逻辑运算:

    • AND, OR, NOT, XOR (与、或、非、异或)。
    • TEST: 执行AND运算但不保存结果,只影响标志位。
  • 应用场景:

    • 置位: 用OR指令将特定位设置为1。
    • 清零: 用AND指令将特定位设置为0。
    • 测试: 用TEST指令检查特定位的状态。
    • 取反: 用XOR指令翻转特定位。

3. 移位指令

  • 算术移位:

    • 算术左移 (SAL): 低位补0,用于带符号数乘2。
    • 算术右移 (SAR): 高位补符号位,用于带符号数除2。
    • 保持数的符号性质。
  • 逻辑移位:

    • 逻辑左移 (SHL): 低位补0。
    • 逻辑右移 (SHR): 高位补0。
    • 用于无符号数或位操作。
  • 循环移位:

    • 循环左移 (ROL): 移出的位从右端移入。
    • 循环右移 (ROR): 移出的位从左端移入。
    • 带进位循环移位: 将进位标志CF作为循环的一部分。

3.4.3 程序控制类指令

这类指令用于改变程序的执行顺序。

1. 转移指令

  • 无条件转移 (JMP):

    • 直接跳转到指定地址。
    • 可以使用各种寻址方式确定目标地址。
  • 条件转移 (Jcc):

    • 根据标志寄存器中的状态位决定是否跳转。
    • 常见条件转移指令:
      • JZ/JE (结果为零则跳转)
      • JNZ/JNE (结果不为零则跳转)
      • JC (有进位则跳转)
      • JNC (无进位则跳转)
      • JS (结果为负则跳转)
      • JO (有溢出则跳转)

2. 子程序调用和返回指令

  • 调用 (CALL):

    • 跳转到子程序地址。
    • 在跳转前将返回地址(CALL指令的下一条指令地址)保存到堆栈或其他约定的地方。
    • 可能还需要保存现场(寄存器状态)。
  • 返回 (RET):

    • 从堆栈(或约定地方)取出返回地址。
    • 跳转回调用点继续执行。
    • 可能还需要恢复现场。

3. 中断相关指令

  • 软中断指令:

    • INT (中断指令): 产生软件中断,用于调用操作系统服务。
    • INT 21H: DOS系统调用。
  • 中断返回指令:

    • IRET (中断返回): 从中断服务程序返回。
    • 需要恢复被中断程序的完整状态(PC、标志寄存器等)。
  • 中断控制指令:

    • CLI (关中断): 禁止中断。
    • STI (开中断): 允许中断。

3.4.4 输入/输出类指令 (I/O)

这类指令用于主机与外设之间的数据交换。

I/O编址方式

  • 独立编址 (I/O映射):

    • I/O端口有独立的地址空间。
    • 使用专门的 IN, OUT 指令。
    • IN AL, 60H: 从60H端口读数据到AL寄存器。
    • OUT 61H, AL: 将AL寄存器数据输出到61H端口。
  • 统一编址 (内存映射):

    • 将I/O端口看作内存单元,使用统一的地址空间。
    • 使用普通的访存指令(如 MOV, LOAD, STORE)进行操作。
    • 简化了指令系统,但占用了内存地址空间。

I/O控制方式

  1. 程序控制I/O: CPU主动查询设备状态
  2. 中断驱动I/O: 设备通过中断通知CPU
  3. DMA方式: 直接内存访问,减轻CPU负担

易考点和难点

重点区分

  • 转移指令(JMP)子程序调用指令(CALL) 的核心区别在于后者需要保存返回地址。
  • 算术移位逻辑移位 的区别:前者保持符号位,后者简单补0。

核心考点

  • 理解条件转移指令依赖于标志寄存器的状态。运算类指令的执行结果会影响标志位,而条件转移指令则根据这些标志位决定程序的流向。
  • 子程序调用过程中的现场保存和恢复机制。
  • 中断处理过程和相关指令的作用。

易考应用

  • 多精度运算的实现(使用ADC和SBB指令)
  • 位操作的典型应用(置位、清零、测试、翻转)
  • 循环程序中条件转移指令的使用