• 【微机原理及接口技术】中断系统


    【微机原理及接口技术】中断系统



    前言

    本篇文章我们会讲到中断的概述,8086/8088中断系统。


    一、中断概述

    中断的基本概念

    中断:指CPU在执行程序中,被内部或外部的事件所打断,转去执行一段预先安排好的中断服务程序;服务结束后,又返回原来的断点,继续执行原来的程序的过程。

    中断系统的功能:

    • 1)能实现中断响应、中断服务及中断返回

    • 2)能实现中断优先权排队
      当多个中断源同时提出中断请求时

    • 3)能实现中断嵌套
      当中断处理过程中,又有新的中断提出请求时

    中断处理过程

    • 中断请求
    • 中断判优
    • 中断响应:断点保护(同时标志寄存器保护)、
      关中断、转向中断处理
    • 中断处理:现场保护、中断服务、恢复现场
    • 中断返回:断点恢复(同时标志寄存器恢复)

    中断服务是进行数据交换的实质性环节


    二、8086/8088中断系统

    8086/8088的中断系统采用向量中断机制
    能够处理256个中断
    用中断向量号0~255区别
    可屏蔽中断还需要借助专用中断控制器Intel 8259A实现优先权管理

    中断源

    • 引起CPU中断的事件——中断源。常见的中断源有:
      外部设备的请求
      由硬件故障引起的
      实时时钟
      由软件引起的
    • 中断源分为:外部中断(硬件中断)、内部中断(软件中断)
      内部中断:CPU内部执行程序出现异常引起的中断
      外部中断:CPU以外的设备、部件产生的中断
    • 8086/8088的外部中断信号:INTR、NMI
      INTR——可屏蔽中断请求,受IF标志的控制。IF=1时,执行完当前指令后CPU对它作出响应。
      NMI——非屏蔽中断请求,任何时候CPU都要响应此中断请求信号。

    中断类型

    在这里插入图片描述

    中断指令:INT n, INTO, IRET

    • 内部中断
      除法错中断
      指令中断
      溢出中断
      单步中断
    • 外部中断
      非屏蔽中断
      可屏蔽中断

    内部中断
    内部中断的中断向量号已定

    除法错中断:向量号为0
    指令中断:向量号为n
    其中,断点中断的向量号为3
    溢出中断:向量号为4
    单步中断:向量号为1

    外部中断

    非屏蔽中断:向量号为2
    外部通过非屏蔽中断NMI请求,必须响应
    非屏蔽中断主要用于处理系统的意外或故障
    可屏蔽中断:向量号来自中断控制器
    外部通过可屏蔽中断INTR请求,由IF控制是否响应;响应时产生INTA*信号
    可屏蔽中断主要用于与外设交换数据
    IF控制可屏蔽中断的响应

    中断标志IF的状态

    IF=0:可屏蔽中断不会被响应
    关中断、禁止中断、中断屏蔽
    系统复位,使IF=0
    任何一个中断被响应时,使IF=0
    执行指令CLI,使IF=0
    IF=1:可屏蔽中断会被响应
    开中断、允许中断、中断开放
    执行指令STI,使IF=1
    执行指令IRET恢复原IF状态

    中断响应过程

    在这里插入图片描述

    例:8086CPU,若NMI、除法错中断和INTR同时产生,则CPU执行完当前指令后对中断请求的检测顺序为( D
    A. NMI、除法错中断、INTR B. NMI、INTR、除法错中断
    C. INTR、除法错中断、NMI D. 除法错中断、NMI、INTR

    中断向量表

    • 中断向量:中断服务程序的入口地址(首地址)
    • 入口地址含有段基址CS和偏移地址IP(32位)
    • 每个中断向量的低字是偏移地址高字是段基址,需占用4个字节
    • 256个中断占用1KB区域,就形成中断向量表
    • 8086/8088中断向量号范围:0H~FFH
    • 8086/8088中断向量表物理地址范围:00000H~003FFH
      在这里插入图片描述
      向量号为n的中断向量物理地址=n×4

    内部中断服务程序

    • 编写内部中断服务程序与编写子程序类似
      利用过程定义伪指令PROC/ENDP
      第1条指令通常为开中断指令STI
      最后用中断返回指令IRET
    • 主程序需要调用中断服务程序
      调用前,需要设置中断向量
      利用INT n指令调用中断服务程序

    中断向量的读取与设置
    读取中断向量
    入口参数:AH=35H,
    AL=中断类型号(中断向量号)
    出口参数:ES:BX=中断向量
    设置中断向量
    入口参数:AH=25H,
    AL=中断类型号(中断向量号),
    DS:DX=要设置的中断向量

    例:
    编写80H号中断服务程序
    功能:显示以“0”结尾的字符串
    利用显示器功能调用INT 10H
    字符串缓冲区首地址为入口参数

    ;数据段
    intoff dw ?
    intseg dw ?
    intmsg db ‘A Instruction Interrupt !’
    db 0dh,0ah,0
    ;保存中断向量
    mov ax,3580h
    int 21h
    mov intoff,bx;保存偏移地址
    mov intseg,es;保存段基地址
    ;设置中断向量
    push ds
    mov dx,offset new80h
    mov ax,seg new80h
    mov ds,ax
    mov ax,2580h
    int 21h
    pop ds
    ;调用中断服务程序
    mov dx,offset intmsg ;入口参数
    int 80h
    ;进入中断服务程序
    new80h proc
    sti ;开中断
    push ax ;保护现场
    push bx
    push si
    ;显示字符串
    mov si,dx
    new1: mov al,[si] ;显示的字符AL
    cmp al,0
    jz new2
    mov bx,0 ;显示的页号和前景色
    mov ah,0eh ;功能号
    int 10h
    inc si
    jmp new1
    ;退出中断服务程序
    new2: pop si ;恢复现场
    pop bx
    pop ax
    iret ;中断返回
    new80h endp
    ;主程序结束
    mov dx,intoff ;设置80H中断向量
    mov ax,intseg
    mov ds,ax
    mov ax,2580h
    int 21h
    mov ah,4ch ;返回操作系统
    int 21h


    总结

    到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦

  • 相关阅读:
    1949-2020年全国31省铁路里程数据
    SpringBoot整合WebService(服务端+客户端)
    Java基于springboot开发的景点旅游项目
    Scala / Java - Guava Sets 高效实践
    MySQL函数count
    文旅如何以数字人三维动画宣传片,实现文化资源数字化转化?
    python的类属性和实例属性
    方舟生存进化是什么游戏?好不好玩
    UVM中uvm_config_db非直线的设置与获取
    「Python循环结构」利用for循环输出信息和求阶乘
  • 原文地址:https://blog.csdn.net/2301_80035097/article/details/139499834