汇编语言—中断 (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内部寄存器的读出命令

  • 6
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用汇编语言编写的 8259 中断控制实验程序,同时实现了中断次数的显示: ```assembly section .data count db 0 ; 定义计数器 section .text handler: pusha ; 保存通用寄存器 inc byte [count] ; 每次中断,计数器加一 mov al, 0x20 out 0x20, al ; 发送中断结束命令 popa ; 恢复通用寄存器 iret ; 中断返回指令 global _start _start: ; 初始化主片和从片 mov al, 0x11 ; ICW1: 边沿触发模式,级联8259,需要ICW4 out 0x20, al ; 主片ICW1 out 0xa0, al ; 从片ICW1 mov al, 0x20 ; ICW2: 设置主片中断向量号为0x20~0x27 out 0x21, al ; 主片ICW2 mov al, 0x28 ; ICW2: 设置从片中断向量号为0x28~0x2f out 0xa1, al ; 从片ICW2 mov al, 0x04 ; ICW3: 设置从片连接到主片的IR2 out 0x21, al ; 主片ICW3 mov al, 0x02 ; ICW4: 8086模式 out 0x21, al ; 主片ICW4 out 0xa1, al ; 从片ICW4 ; 设置中断向量表 mov al, 0x08 mov ah, 0x35 mov dx, handler int 0x21 ; 开启中断 sti ; 循环显示计数器 loop: mov al, byte [count] call print_num call print_nl jmp loop print_num: ; 将数字转为字符串 push ax push bx push cx push dx xor bx, bx mov cx, 10 div cx add ax, 0x3030 mov byte [num_str+1], al mov byte [num_str], ah mov ah, 0x09 mov dx, num_str int 0x21 pop dx pop cx pop bx pop ax ret print_nl: ; 输出换行符 mov ah, 0x02 mov dl, 0x0a int 0x21 mov dl, 0x0d int 0x21 ret section .bss num_str resb 2 ; 存储数字字符串的缓冲区 ``` 在中断服务程序 `handler` 中,每次中断时计数器 `count` 加一,并发送中断结束命令。在 `_start` 函数中,先初始化 8259 芯片,然后设置中断向量表、开启中断,并通过一个无限循环不断显示计数器的值,同时调用 `print_num` 函数将数字转为字符串并输出,再调用 `print_nl` 函数输出换行符,以避免过于频繁的输出。 需要注意的是,在实际的应用场景中,8259 芯片可能已经被 BIOS 或操作系统初始化,这时需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值