本文主要是介绍汇编语言—中断 (8259A),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
中断——外设随机地(指主程序运行到任何一条指令时)或程序预先安排产生中断请求信号,暂停CPU正在运行的程序,转入执行称为中断服务的子程序,中断服务完毕后,返回到主程序被中断处继续执行的过程。
中断源——引起中断的时间
中断系统应具有以下功能:
1、能实现中断响应、中断服务和中断返回
2、能实现中断优先级排队,优先级高的先处理
3、能实现中断嵌套
中断过程
一个完整的中断基本过程包括:中断请求、中断判优、中断响应、中断处理及中断返回等五个基本过程。
(1)中断请求 外设向CPU发出请求
当某一外部中断源要求CPU中断时,首先要想CPU发出中断请求,该请求信号被存放在中断源接口电路的 中断请求触发器 中暂存,并通过INTR(可屏蔽)或NMI(非可屏蔽)信号线引入CPU。
(2)中断判优 判断中断的优先级,优先级高的先处理
由于中断请求是随机的,在某一瞬间有可能出现两个或两个以上中断源同时提出请求的情况。这时必须根据中断源的轻重缓急,给每个中断源确定一个终端级别——中断优先权。
另一个作用能实现中断嵌套。
(3)中断响应 CPU进行执行中断程序前的预处理
CPU每执行完一条指令后,查询是否有中断请求。当查询到有中断请求且此时CPU允许中断(即IF=1,开中断),CPU响应中断。
响应中断后系统做的工作:
1. 自动关中断:通过使IF清零来实现.(IF(中断允许标志位)=0,TF(调试标志位)=0)
2. 保存FR(Flag)和断点;(入栈保护断点)
3. 形成中断入口地址。通过中断矢量,去中断向量表中查找中断程序的入口地址。
(4)中断处理
执行中断服务程序
1. 中断服务开始要用压栈指令(PUSH)将要用到的寄存器内存压入堆栈,以便返回到主程序时能正常运行。——保护现场
2. 中断服务程序结束后,用POP指令把所保存的有关寄存器的内容从堆栈中弹出,以便恢复到中断前状态。——恢复现场
(5)中断返回 恢复现场
通常在中断返回前,要用指令开中断,以便再次响应中断,然后执行中断返回指令IRET。IRET指令具有弹出断点地址送IP和CS及恢复标志寄存器FR的功能。子程序返回是RET。
8086/8088的中断系统
中断类型码:8位
每个中断类型码占用 4 字节。
硬件中断——由外部硬件产生的,也称外部中断。
非屏蔽中断:通过CPU的NMI引入,它不受内部中断允许标志位IF的屏蔽,一般在一个系统中只允许一个非屏蔽中断。
可屏蔽中断:通过CPU的INTR引入,它受IF的控制,只有在IF=1时,CPU才能响应中断源的请求。当IF=0时,中断请求被屏蔽。
软件中断——CPU根据软件的某些指令或软件对标志寄存器某个标志位的设置而产生的,由于它与外部中断电路完全无关,故称为内部中断。
中断向量表
存放中断地址的一段内存空间称中断向量表。
存放各类中断的中断服务程序的入口地址
表的地址位于内存的:0000H~03FFH 1KB大小,共256个入口
每个入口占用4个单元,依次位IP:CS,低字节为段内偏移,高字节为段基址。
中断向量地址指针 = 4 * 中断类型码
各类型中断的优先权及中断响应
(1)软件查询方 式
缺点:效率低
(2)硬件优先权排队电路
简单硬件方式——菊花链法或链式优先权排队电路。
专用硬件方式——可编程的中断控制器 8259A
软件 > 硬件(NMI > INTR) > 单步
8086/8088系统中,中断优先权次序从高到底排序为:除法出错、INTn、INTO、NMI、INTR、单步中断。
外部中断的处理过程
当一个可屏蔽中断(INTR)被响应时,CPU实际执行了7个总线周期,即:
(1)执行第一个INTA周期。
(2)执行第二个INTA周期,被响应的外设通过D0~D7的8位数据线提供中断类型码n(由8259A提供),CPU接到类型码后,将它左移两位,形成向量表指针存入暂存器。
(3)执行一个总线写周期,把FR压栈。同时IF和TF为0,以禁止中断响应过程中其他可屏蔽中断的进入,同时也禁止了中断过程中出现单步中断。
(4)执行一个总线写周期,CS压栈。
(5)执行一个总线写周期,IP压栈。
(6)执行一个总线读周期,从中断向量表中取出中断服务程序入口地址的偏移量送IP中。
(7)执行一个总线读周期,从中断向量表中取出中断服务程序入口地址的段值送CS。
对于非屏蔽与软中断跳过第(1)、(2)步,从第(3)步开始执行到第(7)步。(类型码无需从外部获取)
8259A可编程中断控制器
1、功能
(1)具有8级优先权控制,级联可能扩展到64级。
(2)每一级中断都可能屏蔽或允许。
(3)在中断响应周期,8259A可提供相应的中断向量号(中断类型号)。
(4)8259A的工作方式,可通过编程来进行选择。
8259A的编程
8259A的编程分两部分:
(1)初始化编程
由CPU向8259A送2~4字节的初始化命令字ICW。
写初始化命令字ICW1——芯片控制字
写初始化命令字ICW2——中断类型控制字(中断类型码)
用来定义中断类型码的高5位
写初始化指令字ICW3——主/从片初始化(级联控制字)
写初始化命令字ICW4——方式控制字
8259A结束中断处理的方式有:
1、普通中断结束方式:任何一级中断服务程序结束时给8259A发送一个EOI命令,8259A将ISR寄存器中级别最高的置'1'位清0,这种方式只有在当前结束的中断总是尚未处理完的级别最高的中断时才能使用。
2、自动中断结束方式:中断服务程序结束时将当前结束的中断级别也传送给8259A,8259A将ISR寄存器中指定级别的响应置'1'位清零,适用于在任何情况下使用。
3、特殊中断结束方式:特殊终端结束方式是在普通中断结束方式的基础上,当终端服务结束给8259A发出EOI命令的同时,将当前结束的中断级别也传给8259A,即在命令字明确指出对ISR寄存器中指定级别相应位清0,所以这种方式也称‘指定EOI方式’。
(2)工作方式编程
由CPU向8259A送三个字节的工作命令字OCW,以规定8259A的工作方式。该命令字可在8259A初始化命令字ICW后的任何时间写入。
操作命令字OCW1——屏蔽操作命令字
用来设置或清除对中断的屏蔽(设置IMR的值)
操作命令字OCW2——中断方式命令字
设置优先循环和中断结束方式
操作命令字OCW3——状态操作命令字
设置和撤销特殊屏蔽方式、设置中断查询方式、设置对8259A内部寄存器的读出命令
这篇关于汇编语言—中断 (8259A)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!