DJ15 8086 中断程序设计

目录

一、8086/8088 中断系统

1. 8086/8088 中断源类型

2. 中断向量表

3. CPU 中断类型码的获取方法

二、8259A 的引线及内部结构

1. 外部引线

2. 内部结构

3. 与系统总线的连接方式

4. 级联连接方式

5. 中断触发方式

三、8259A 的工作过程

四、8259A 的工作方式

1. 中断优先级控制方式

2. 中断嵌套方式

3. 中断结束处理方式

4. 中断源屏蔽方式

五、8259A 的控制命令

1. 8259A 内部寄存器的寻址方式

2. 8259A 的初始化顺序

3. 8259A 的初始化命令字 ICW

4. 8259A 初始化编程

5. 8259A 操作命令字

6. 8259A 编程

六、中断程序设计概述


一、8086/8088 中断系统

1. 8086/8088 中断源类型

对内部中断来说,中断的控制完全是在 CPU 内部完成的;而对于外部中断,则是利用 CPU 的两条中断输入信号线 INTR 和 NMI 来告诉 CPU 已发生了中断事件。

INTR 称为可屏蔽中断输入信号,因为 CPU 能否响应该信号还受到中断允许标志寄存 IF 的控制。

; 中断允许标志位
IF = 1    ; 开中断,CPU在一条指令执行完后对INTR做出响应
IF = 0    ; 关中断,CPU不予响应,该中断请求被屏蔽

NMI 称为非屏蔽中断请求输入信号,上升沿有效。它不受标志位 IF 的约束,只要 CPU 在正常地执行程序,它就一定会响应 NMI 的请求。

2. 中断向量表

中断向量表用于存放各类中断服务程序的入口地址。

  • 每个入口地址占 4 个字节,低字为段内偏移地址,高字为段地址
  • 向量表共存放 256 个入口地址
  • 向量表的地址范围为 00000H ~ 003FFH
  • 向量表的大小为 256 × 4B = 1KB

向量地址(考点)

向量表所在段的段地址 = 0
向量地址的偏移地址 = n * 4    ; n为中断类型码

将用户定义的中断服务程序入口地址放入向量表的方法。

题:将类型码为 48H 的中断服务子程序 TIMER 的中断向量放入向量表。 

MOV AX, 0000H           ; 向量表所在的段地址=0
MOV DS, AX

MOV SI, 48H*4           ; 向量地址的偏移地址

MOV BX, OFFSET TIMER    ; 入口地址的偏移地址
MOV [SI], BX

MOV BX, SEG TIMER       ; 入口地址的偏移地址
MOV [SI+2], BX

3. CPU 中断类型码的获取方法

① 内部中断和 NMI 中断

此类中断没有 INTA 总线周期,中断类型码固定或者由指令给出。

② 可屏蔽中断

二、8259A 的引线及内部结构

1. 外部引线

2. 内部结构

8259A 的内部结构框图

3. 与系统总线的连接方式

① 缓冲方式

② 非缓冲方式

4. 级联连接方式

注意:图中 SP/EN 的连接只针对非缓冲方式。

5. 中断触发方式

① 边沿触发方式

② 电平触发方式

三、8259A 的工作过程

(2)综合当前中断服务寄存器 ISR 和中断屏蔽寄存器 IMR 的状态,找出最高优先权的中断请求,并且判断是否能够发出中断请求。若能则向 CPU 发出信号 INT,请求中断服务。

(3)在多级级联的情况下,主片收到第一个 INTA 脉冲后,通过 CAS2 ~ CAS0 发出从片编码。所有从片均将收到该编码,并且与自身编码进行比较。若相等,则该片在收到第二个 INTA 脉冲后发出中断类型码。

四、8259A 的工作方式

1. 中断优先级控制方式

① 固定优先级方式

② 自动循环优先级方式

③ 特殊循环优先级方式

用控制命令指定最低优先级的中断源。

2. 中断嵌套方式

① 普通全嵌套方式

② 特殊全嵌套方式

③ 对比

3. 中断结束处理方式

① 自动中断结束方式

② 正常中断结束方式

③ 特殊中断结束方式

主要用于特殊循环方式及特殊屏蔽方式下的中断结束,即当前执行的中断程序所对应的 ISR 中需要复位的位不一定是所有置 1 的优先级最高位。

④ 小结

不管是正常中断结束方式,还是特殊中断结束方式,在一个中断服务子程序结束时,对于级联使用的 8259A 都必须发两次中断结束命令,一次是发给主片的,另一次则是发给从片的。

4. 中断源屏蔽方式

① 普通屏蔽方式

② 特殊屏蔽方式

PPT:

五、8259A 的控制命令

8259A 是可编程中断控制器,在它工作之前,必须通过软件向其写入控制命令的方法来让它工作在人们所希望的状态下,这就是 8259A 的编程。控制命令分为:

  • 初始化命令字 ICW(Initialization Command Word)
  • 操作命令字 OCW(Operation Command Word)

写入 8259A 后被保存在内部的 ICW 和 OCW 寄存器组中。相应地,对 8259A 的编程也分为初始化编程和操作方式编程两个步骤:

  • 初始化编程:由 CPU 向 8259A 送 2~4 个字节的初始化命令字 ICW。在 8259A 工作之前,必须写入初始化命令字使其处于准备就绪状态。
  • 操作方式编程:由 CPU 向 8259A 送 3 个字节的操作命令字 OCW,以规定 8259A 的操作方式。OCW 可在 8259A 初始化以后的任何时刻写入。

1. 8259A 内部寄存器的寻址方式

当对 8259A 进行写时,若 I/O 地址为奇数,则写的对象将包括 4 个寄存器(ICW2、ICW3、ICW4 和 OCW1),即一个 I/O 地址对应了 4 个寄存器,为了区分到底写入的是哪个寄存器,8259A 规定初始化的顺序必须严格按照规定的顺序依次写入,即根据顺序来区分不同的寄存器。

2. 8259A 的初始化顺序

3. 8259A 的初始化命令字 ICW

① ICW1:初始化字(确定写入字节数 2~4)

写 ICW1 意味着重新初始化 8259A,ICW1 决定了写几次寄存器,即写几个字节。

② ICW2:中断类型码

ICW2 为中断类型码寄存器,用于存放中断类型码。CPU 响应中断时,8259A 将该寄存器内容放到数据总线上供 CPU 读取。

初始化时只需设定中断类型码的高 5 位,低 3 位由 8259A 在中断响应时根据中断源的序号自动填入。

举例

③ ICW3:级联控制字

ICW3 仅在多片 8259A 级联时需要写入。主片的 8259A 的 ICW3 与从片的 ICW3 在格式上不同。ICW3 应紧接着 ICW2 写入同一 I/O 地址中。

举例

④ ICW4:方式命令字(主要完成主从设定)

ICW4 紧跟在 ICW3 之后写入同一 I/O 地址中。

缓冲方式与非缓冲方式:

4. 8259A 初始化编程

举例:以微型计算机中使用的单片 8259A 为例,试对其进行初始化设置。在微型计算机中,8259A 的 ICW1 和 ICW4 的端口地址分别为 20H、21H 。

初始化设置的程序段如下:

MOV AL, 13H     ; 设置ICW1
                ; 中断请求信号采用边沿触发方式
                ; 单片8259A,后面使用ICW4
OUT 20H, AL

MOV AL, 18H     ; 设置ICW2
                ; 将中断类型码高5位指定为00011
OUT 21H, AL

MOV AL, 0DH     ; 设置ICW4
                ; 不用特殊全嵌套方式/不用中断自动结束
                ; 采用缓冲方式/工作于8088/8086系统
OUT 21H, AL

5. 8259A 操作命令字

① OCW1:中断屏蔽字

OCW1 用于决定中断请求线 IR 被屏蔽否。初始时为全 0(全部允许中断)。

② OCW2:中断结束和优先级方式控制字

OCW2 与 OCW3 共用一个端口地址,但其特征位 D4D3=00,因此不会发生混淆。

SL = 1,用于特殊循环优先级方式;SL = 0,用于普通循环优先级方式。

③ OCW3:屏蔽方式和状态读出控制字

三大功能:

6. 8259A 编程

例、两片 8259A 级联,提供 15 级向量中断。CAS2 ~ CAS0 作为互连线,从片 8259A 的 INT 直接连到主片 8259A 的 IR2 上。

提供 15 级向量中断”?

① 主片 8259A 初始化编程

; 对主片8259A的初始化
INTM00 EQU 020H         ; 主片8259A端口0
INTM01 EQU 021H         ; 主片8259A端口1
...
MOV AL, 00010001B       ; 写入ICW1
                        ; 边沿触发、级联方式、要写ICW4
OUT INTM00, AL

JMP SHORT $+2           ; I/O端口延时,等价于NOP, NOP

MOV AL, 00001000B       ; 写入ICW2
                        ; 设置主片中断类型码,起始为08H
OUT INTM01, AL

JMP SHORT $+2

MOV AL, 00000100B       ; 写入ICW3
                        ; 表示从8259A的INT输出是连接到主片的IR2
OUT INTM01, AL

JMP SHORT $+2

MOV AL, 00010001B       ; 写入ICW4
                        ; 非总线缓冲、特殊全嵌套、一般EOI
OUT INTM01, AL

JMP SHORT $+2

② 从片 8259A 初始化编程

; 对从片8259A的初始化
INTS00 EQU 0A0H         ; 从片8259A端口0
INTS01 EQU 0A1H         ; 从片8259A端口1
...
MOV AL, 00010001B       ; 写入ICW1
                        ; 边沿触发、级联方式、要写ICW4
OUT INTS00, AL

JMP SHORT $+2           ; I/O端口延时,等价于NOP, NOP

MOV AL, 01110000B       ; 写入ICW2
                        ; 设置从片中断类型码,起始为70H
OUT INTS01, AL

JMP SHORT $+2

MOV AL, 00000010B       ; 写入ICW3
                        ; 设置从片识别标志,对应主片的IR2
OUT INTS01, AL

JMP SHORT $+2

MOV AL, 00000001B       ; 写入ICW4
                        ; 非总线缓冲、普通全嵌套、一般EOI
OUT INTS01, AL

JMP SHORT $+2

六、中断程序设计概述

① 中断服务程序主体

MY_INT PROC FAR
    PUSH <需要保护的寄存器1>
    ...
    PUSH <需要保护的寄存器i>
    STI                         ; 开中断
    <中断服务程序主体>
    CLI                         ; 关中断
    MOV AL, 20H                 ; EOI命令,00100000B
    OUT 20H, AL                 ; 写OCW2
    POP <在入口处保护的寄存器i>
    ...
    POP <在入口处保护的寄存器1>
    STI                         ; 开中断
    IRET
MY_INT ENDP

② 主程序设置中断向量

; 设置自己的中断服务程序入口
CLI                             ; 关中断
PUSH DS

XOR AX, AX
MOV DS, AX                      ; 向量表段地址=0

MOV BX, n*4                     ; 中断类型码

MOV AX, OFFSET MY_INT
MOV [BX], AX

MOV AX, SEG MY_INT
MOV [BX+2], AX

POP DS
STI                             ; 开中断

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中断服务程序设计实验 2.7.1 实验目的 1、 熟悉中断的概念、中断响应过程、中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。 2、 掌握中断服务程序设计方法。 2.7.2 实验预习要求 1、 复习中断的有关内容。 2、 复习中断服务程序设计方法。 3、 读懂“2.7.4 实验内容”中给出的源程序,以便上机调试。 4、 从“2.7.5 实验习题”中任选一道题目,编写源程序,以便上机调试。 2.7.3 中断服务程序设计方法简介 由2.6节中的中断向量表可以看出,PC中断系统中中断类型可分为三类: 磁盘操作系统DOS提供的中断服务程序中断类型号从20H到2FH; 系统主板BIOS芯片提供的BIOS中断服务程序,包括系统内部中断中断类型号从00H到07H;系统8级外部中断中断类型号从08H到0FH,它们对应于接在可编程中断控制器8259A的8个中断请求输入端IR0IR7的8个外部中断,其中IR2(中断类型号0AH)为系统保留,用户可通过该引脚实现对用户所需的外部硬件中断的管理;设备驱动程序中断类型号从10H到1FH等; 用户定义的中断中断类型号从60H到7FH、F1H到FFH。用户可根据实际需要将某些通用性强的子程序功能通过中断服务程序来实现。一旦设置好了这样的中断服务程序,在其他应用程序中就可以调用这些中断服务程序设计中断服务程序的步骤如下: 1、 选择一个中断类型号 如果采用硬件中断,则要使用硬件决定的中断类型号。在PC机系统中,使用了一片可编程中断控制器8259A来对外部硬件中断进行管理,具体内容参见教材264页“8259A应用举例”,可以看出IR2为系统保留,其中断类型号为0AH。若用户需要,可将用户所需的外部中断源发来的中断请求信号接到IR2,编写该中断所需的中断服务程序,并将该中断服务程序的入口地址写到中断向量表0AH4AH4+3四个单元中,这样,当接在IR2上的外部中断源发来中断请求信号时,系统就会根据得到的类型号(0AH)到中断向量表中找出其入口地址,并转去执行该中断服务程序。 如果采用软件中断,即利用执行int n指令的方式执行中断服务程序,则可从系统预留给用户的中断类型号60H7FH、F1HFFH中选择一个。 2、 将中断服务程序的入口地址置入中断向量表的相应的四个存储单元中 确定了中断类型号,还要把中断服务程序入口地址置入中断向量表,以保证在中断响应时CPU能自动转入与该类型号相对应的中断服务程序。下面介绍两种将中断服务程序入口地址置入中断向量表的方法。 (1) 直接装入法 用传送指令直接将中断服务程序首地址置入矢量表中。设中断类型号为60H(此类型号对应的矢量表地址为从00180H开始的四个连续存储单元)。 PUSH DS XOR AX,AX MOV DS,AX ;将数据段寄存器清零 MOV AX,OFFSET INT60 ;将中断服务程序INT60所在段内的偏移地址送AX MOV DS:[0180H],AX ;将中断服务程序偏移地址送中断向量表00180H和00181单元 MOV AX,SEG INT60 ;将中断服务程序INT60所在段的段地址送AX MOV DS:[0180H+2],AX ;将中断服务程序所在代码段的段地址送00182H和00183单元 POP DS (2) DOS系统功能调用法 功能号(AH)=25H; 入口参数:(AL)=中断类型号, (DS)=中断服务程序入口地址的段地址 (DX)=中断服务程序入口地址的偏移地址 下面程序段完成中断类型号为60H的入口地址置入。 PUSH DS ;保护DS MOV DX,OFFSET INT60 ;取服务程序偏移地址 MOV AX,SEG INT60 ;取服务程序段地址 MOV DS,AX MOV AH,25H ;送功能号 MOV AL,60H ;送中断类型号 INT 21H ;DOS功能调用 POP DS ;恢复DS 3、 使中断服务程序驻留内存,以便其他应用程序调用 实现这一步骤的必要性在于:一旦中断服务程序驻留内存后,一般程序员使用这一新增的中断调用就如同调用DOS或BIOS的中断程序一样,只要了解其入口要求和返回参数就可调用。程序驻留在内存后,它占用的存储区就不会被其他软件覆盖。使程序驻留内存,要求该程序以 .COM形式运行,这种种结构的程序要求入口定位于100H,并且数据和代码均在同一个段内,这样,.COM程序就被定位于低地址区,DOS常在低地址区增加驻留程序,而 .EXE程序被定位于高地

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值