【汇编与接口】中断服务总结

中断

中断:是指CPU在正常运行程序时,由于内部/外部事件或由程序触发,而转到为中断事件服务的程序中去,服务完毕再返回执行原程序,这一过程称为中断。

  • 硬件中断:由外部硬件产生的中断
  • 软件中断:由程序预先安排的中断
  • 中断的特征:具有随机性

中断类型

微机中,中断源大致可分为两类:一类是硬中断(外部中断);另一类是软中断(内部中断);此外还有一种特殊中断(异常)。

硬中断

  1. 可屏蔽中断INTR
    外部设备通过中断控制器向微处理器申请而产生的中断。CPU可以用指令进行屏蔽(CLI)开放(STI)
  2. 不可屏蔽中断NMI
    外部设备通过中断请求线NMI向微处理器申请而产生的中断。CPU必须响应,不能屏蔽。中断号为2

软中断

由程序中发出中断指令INT n 产生的,n为中断号。软中断处理过程中,CPU不发中断响应信号,也不要求中断控制器提供中断号,包括DOS中断功能和BIOS中断功能。

  1. DOS功能调用
    INT 21H。功能庞大,包含0~6CH个子功能,包括对设备、文件、目录及内存的管理功能,是用户访问系统资源的主要途径。与硬件依赖性小,兼容性好。
  2. BIOS功能调用
    存在ROM中,独立于DOS的I/O中断服务程序,直接对I/O设备进行控制,也是用户访问系统资源的途径之一。与硬件依赖性大,兼容性差。

特殊中断:不由外部设备产生,也不由INT n 产生,而是由内部突发事件产生。不可屏蔽。如:0号:除数为零中断;1号:单步中断;3号:断点中断;4号:溢出中断。

中断号

中断号与中断号的获取

  1. 中断号
    系统给每个中断分配了一个中断号,以便识别处理。
    CPU通过中断号(n)×4得到中断向量表中的位置,从中就能取出中断服务程序的地址(CS:IP)。
  2. 中断号的获取
  • 对于可屏蔽中断:在中断响应周期从中断控制器中获取
  • 对于软中断INT n:中断号即为n
  • 对于不可屏蔽中断及特殊中断:系统预先设置好
    NMI中断号为02H,非法除数中断号为0H

中断响应周期

CPU收到中断请求,执行完当前指令,若IF=1,则进入中断响应周期,连续发出两个中断应答信号INTA完成中断响应周期。

  1. ++置位中断服务寄存器ISR++:第一个INTA1使CPU输出总线封锁信号,而8259根据选中的最高优先级,在ISR相应位置1,以登记。
  2. ++读取中断号++:第二个INTA2使CPU撤销总线的封锁信号,中断控制器将中断号送到数据线,由CPU读入。

中断号的分配


中断触发方式和中断排队方式

  1. 中断触发方式
  • 边沿触发
  • 电平触发

触发方式在中断控制器初始化时设定。PC微机系统的可屏蔽中断采用正跳变边沿触发方式。

  1. 中断排队方式
  • PC微机中断优先级的顺序是:
    软件中断->不可屏蔽中断->可屏蔽中断
  • 当系统有多个中断源同时申请中断时,CPU在一个时刻只能响应处理一个中断,就必须进行优先级排队

中断排队的方式有:

  • 按优先级排队:
    优先级高的先响应。
  • 循环轮流排队:
    不分级别,CPU轮流响应各个中断源的中断请求。
  1. 中断嵌套
    当CPU正处理某个中断时,出现更高级中断源的申请,CPU暂停该中断服务,转而去处理更高级中断的服务,待处理完后,再返回到被中断的服务程序继续执行。
    高级中断可中断低级中断,级别相同或级别低的中断源不能打断级别高的中断服务。

中断向量与中断向量表

中断向量表中的中断向量存储着中断服务程序的入口地址。

中断向量与中断向量表

  1. 中断向量
  • 中断服务程序预先放在程序存储区中
  • 该服务程序的入口地址由段基址CS(2个字节)和偏移地址IP(2个字节)两个部分共4个字节组成。此即为中断向量
  • 根据中断向量可计算出中断服务程序的起始地址:CS左移4位再加上IP。中断服务程序从此开始执行
  1. 中断向量表
  • 所有的中断向量集中存放到存储器的某一区域,这一区域称之为中断向量表
  • PC中,规定存储器的000H-03FFH作为中断向量存储区(共1024个字节),每个中断向量包含4个字节,可容纳256个中断向量,即可处理256个中断服务程序
  • IP放在两个低字节单元,CS放在两个高字节单元
  • 中断号×4得到一个指针,指向中断向量表,找到在中断向量表中的中断向量就可获取中断服务程序的入口地址

  1. 中断向量的填写
    系统填写用户填写两种情况:
  • 系统设置的中断服务程序,其中断向量由系统负责填写。其中,由BIOS提供的服务程序在加电后由BIOS负责填写;DOS提供的服务程序由DOS在启动时负责填写
  • 用户开发的中断系统,由用户负责填写,可采用MOV指令直接向中断向量表中填写中断向量

    用到存字符串指令:STOSW
  • 执行操作:把AX的内容存放到DI指定的附加段的字单元中,并根据DF值修改DI的内容
  • 在执行该指令之前,必须把要存入的数据预先存入AX中,必须预置DI的初值
  • DI所指向的存储单元只能在附加段中,即必须是ES:[DI]

例:设60H号的中断的服务程序的段基址是SEG_INTR60,偏移地址OFFSET_INTR60, 程序如下:

用MOV指令填写中断向量

CLI                    ;关中断
CLD                 
MOV  AX,0             ;设置中断向量表的基地址为0
MOV  ES,AX
MOV  DI,4*60H         ;中断向量指针->DI
MOV  AX,OFFSET_INTR60 ;中断服务程序的偏移地址->AX
STOSW                  ;AX->[DI][DI+1]中,然后DI+2
MOV  AX,SEG_INTR60    ;中断服务程序的段基址->AX   
STOSW                  ;AX->[DI+1][DI+2]
STI

也可以用下述程序段将入口地址直接写入中断向量表

MOV  AX,0             ;
MOV  ES,AX
MOV  BX,4*60H         ;4*中断号->BX
MOV  AX,OFFSET_INTR60 ;中断服务程序的偏移地址
MOV  ES:[BX],AX        ;装入60H号中断向量的低字段
MOV  AX,SEG_INTR60    ;中断服务程序的段基址   
MOV  ES:[BX+2],AX      ;装入60H号中断向量的高字段

中断处理过程

可屏蔽中断的处理过程

  1. 中断申请与响应握手
  2. 标志位的处理与断点保存
  3. 向中断服务程序转移并执行中断服务程序
  4. 返回断点

不可屏蔽中断的处理过程

  1. 中断申请与响应握手
    必须立即响应,但不发中断响应信号。
    系统安排中断号为2。
  2. 标志位的处理与断点保存
    与可屏蔽中断类似。
  3. 向中断服务程序转移并执行中断服务程序
    NMI中断向量的两个字放在0008H和000AH处。
  4. 返回断点

软件中断的处理过程与此类似

中断控制器

82C59A外部特性和内部寄存器

1.外部特性
面向CPU的信号
面向外设的8根中断请求线
面向同类芯片的中断请求级联线

8259A的外部引脚

  • D7-D0:双向数据输入/输出引脚,用以与CPU进行信息交换
  • IR7-IR0:8级中断请求信号输入引脚
  • INT:中断请求信号输出引脚,高电平有效,用以向CPU发中断请求,应接在CPU的INTR输入端
  • INTA(上划线):中断响应应答信号输入引脚,低电平有效,接在CPU的中断应答信号输出端
  • RD、WR(上划线):读/写控制信号输入引脚,低电平有效,实现对8259A内部有关寄存器内容的读写操作
  • CS(上划线):片选信号输入引脚,低电平有效,决定了8259A的端口地址范围
  • A0:8259A两组内部寄存器的选择信号输入引脚,决定8259A的端口地址
  • CAS2-CAS0:级连信号引脚,当8259A为主片时,为输出;否则为输入,实现芯片的级连。三个引脚信号的不同组合000~111,刚好对应于8个从片
  • SP/EN:级连管理信号输入引脚,在非缓冲方式下,若8259A在系统中作主片用,则SP=1;否则SP=0;在缓冲方式下,则用作8259A外部数据总线缓冲器的启动信号
  • +5V、GND:电源和接地引脚


2. 内部寄存器

①中断请求寄存器(IRR)
存放IR线上提出了中断请求的中断源,对应于连接在IR0~IR7线上的外设所产生的中断请求。哪一根输入线有请求,哪位就置“1”

②中断屏蔽寄存器(IMR)
是对中断请求IRi起屏蔽作用,即对中断请求IRi是屏蔽还是允许,寄存器8位对应8个中断屏蔽。哪个中断被屏蔽,哪位就写“1”,即禁止IRi提出中断请求。若写“0”,则允许IRi的提出中断请求。

③中断服务寄存器ISR
ISR被用来存放正在被服务的所有中断级,包括尚没服务完而中途被别的中断所打断了的中断级。
在非自动中断结束方式下,ISR的复位,要有中断结束命令EOI来执行。

④优先权分析器(PR)
当在IRi输入端有中断产生时,送到PR,PR检查进来的中断请求的优先级并和“正在服务中的中断”进行比较,确定是否让这个中断请求送给处理器。

82C59A端口地址

  • 82C59A是系统资源,其端口地址由系统分配
  • 主片的两个端口地址为20H和21H;从片的两个端口地址为0A0H和0A1H
  • 具体使用哪个端口地址,根据是哪个初始化命令字ICW和哪个操作命令字OCW而有所不同(即由A0决定)

82C59A的工作方式

  1. 中断触发方式
    确定中断请求的启动方式
  • 边沿触发方式。IR0-IR7线上出现由低到高的跳变,表示有中断请求
  • 电平触发方式。IR0-IR7线上出现高电平时,表示有中断请求
  1. 中断级联方式
    82C59可以单片使用,也可以多片使用,级联方式应用时有主片和从片的问题。


3. 中断屏蔽方式

  • 常规中断屏蔽方式:常用。通过向屏蔽寄存器写入8位屏蔽码来屏蔽或开放相应位的中断。++1:屏蔽;0:开放++
  • 特殊屏蔽方式。少用。允许比正在服务的中断级别低的中断申请。
  1. 中断优先级排队
  • 完全嵌套方式
    只能高优先级中断低优先级的中断。
  • 特殊完全嵌套方式
    同级优先级的中断可以相互中断
  • 优先级轮换方式。被服务完的中断源优先级将自动变为最低,而其后的中断源的优先级将变为最高。优先级轮换方式有两种
    • 优先级自动轮换方式:当一个中断被服务后,自动降为最低,初始顺序是:IR0,IR1,…
    • 优先级指定轮换方式:与自动的差别是,初始轮换的优先级可以由程序指定。
  1. 中断结束方式
  • 自动结束方式
    在中断响应周期,就自动清零了该中断源的ISR寄存器中被置1的位。这常用于没有中断嵌套的系统。
  • 非自动结束方式
    在中断服务程序后,必须使用中断结束命令EOI才能清除ISR中的相应位。这是最常用的中断结束方式。它有两种形式:
    • 指定中断结束命令:即要指定结束中断请求线IRi的编号。
    • 不指定中断结束命令:不指定IRi的编号。

82C59A的编程命令

编程命令是为建立中断工作方式和实现中断处理而设置。共有7个命令,分为初始化命令ICW(1~4)和操作命令OCW(1~3)两类。

++初始化命令++: 确定中断控制器的基本配置或工作方式

++操作命令++:执行由ICW命令定义的基本操作

初始化命令字(ICW1-ICW4)

必须在对82C59A初始化时完成。需要按顺序发送ICW1 –ICW4

中断请求触发方式和单片/多片的设置(ICW1)

功能:设定中断请求的触发方式、级联和CPU的特性。

若8259A采用电平触发,单片使用,需要ICW4
则:

  MOV  AL,00011011B  ;ICW1的内容
  OUT  20H,AL        ;写入ICW1端口 ,20H为微机主片的端口(地址A0=0)
                      ;(A0=0) 
中断号的设置(ICW2)

功能:提供给CPU的中断类型号


IRQ0~7低3位上的编码和高5位上的中断类型码一起构成一个完整的8位中断类型号

注意:向ICW2写入中断类型号只写高5位,低3位写0,即08H

MOV  AL,08H ;中断类型号的高5位
OUT  21H,AL ;写入ICW2的端口(A0=1)

中断级联方式的设置(ICW3)



例如:从片的请求线INT连到主片的IR2,则:

主片的ICW3=00000100B=04H
	MOV AL,04H	;主片的ICW3
	OUT 21H,AL

从片的ICW3=00000010B=02H
  	MOV  AL,02H 	;从片的ICW3
    OUT  0A1H,AL	;从片的地址由译码决定
					(0A1H为从片的端口地址)
中断优先级排队方式和中断结束方式设置(ICW4)

  • A0=1
  • D5-D7高3位为0
  • D4(SFNM)
    =1特定完全嵌套方式
    =0 一般完全嵌套方式
  • D3(BUF)
    =1 为缓冲方式,SP/EN 作输出
    线,用于控制缓冲器的方向
    =0 为非缓冲方式,SP/EN作输入线
  • D2(M/S)
    =1 为缓冲方式下作主片
    =0 为缓冲方式下作从片

:非缓冲方式(BUF=0时),则M/S无意义,
此时主/从由SP端外输入决定。

  • D1(AEOI)
    =1 自动结束方式,ISR有自动
    复位(清0)功能
    =0 为非自动结束方式,要发EOI命令
  • D0(uPM)
    =1 用于16位以上微机
    =0 用于8位微机

例:某计算机的CPU为80286,而8259A与系统总线之间采用缓冲器连接,非自动结束方式,正常完全嵌套,只用1片8259A。

ICW4=00001101B=0DH
相应的初始化程序段:
	MOV  AL,0DH
    OUT  21H,AL

操作命令字( OCW1-OCW3 )

初始化后,即在程序执行中,使用OCW命令对中断控制器进行动态控制。
不需要按顺序发送,在程序中任意安排。

中断屏蔽/开放操作(OCW1)

例:要使中断源IR3开放,其余被屏蔽。

则:OCW1=11110111B=F7H
相应的程序段: 
		MOV  AL,0F7H
    	OUT  21H,AL   ;OCW1内容送端口
中断结束控制和中断优先级排队控制操作(OCW2)



一些实例:
a.不指定的EOI命令,全嵌套方式:00100000
b.指定的EOI命令,全嵌套方式: 01100L2L1L0
c.不指定的EOI方式,优先级自动轮换:10100000
d.自动EOI方式,优先级自动轮换:10000000
e.自动EOI方式,取消优先级自动轮换:00000000
f.指定的EOI方式,优先级特殊轮换:11100L2L1L0
g.优先级特殊轮换:11000L2L1L0

特定的屏蔽/开放操作(OCW3)

功能:

  • 用来设置查询中断方式
  • 设置特定屏蔽方式
  • 读取8259A的IRR,ISR寄存器的内容

    读状态操作(OCW3格式中的D1 D0 )
    8259A内部有3个寄存器IRR,ISR,IMR可供CPU读出当前的内容。
    (1)读IRR和ISR的方法
    CPU先指定读哪个寄存器,然后再发IN指令,才能读取ISR和IRR中的内容。当8259A初始化后,自动指向读IRR寄存器。
    (2)读IMR的方法
    不需要先发指定命令,只要读奇地址端口。

例:读ISR寄存器的内容
分两步:

  • 通过OCW3指定被读的寄存器
    OCW3为00001011B=0BH,表示下个RD要读ISR
  • 用IN指令读出ISR寄存器的内容
MOV  AL,0BH    ;OCW3表示读ISR
OUT  20H,AL    ;20H为OCW3的口地址
IN   AL,20H    ;读ISR寄存器 

82C59A对中断管理的作用

  1. 接收和扩充I/O设备的中断请求
  2. 进行中断优先级排队
  3. 向CPU提供中断号
  4. 进行中断的开放与屏蔽
  5. 执行中断结束命令

可屏蔽中断系统

中断系统的初始化

在系统运行之前,系统中的每个8259A必须按先后次序接收CPU的2-4个ICW初始化命令字进行初始化。初始化命令字必须按规定的顺序写入。

对16位机,且多片,则主片与从片的ICW3要分别写。

用户对系统诊断资源的使用

两类编程命令:初始化命令字ICW和操作命令字OCW。

ICW:

  1. 在初始化里完成,必须按一定的顺序
  2. 在PC机中已有系统软件完成,不需要也不允许由用户自己去设置。
  3. 一般只对于没有配置完善操作系统的单板微机上进行。

OCW:

  1. 没有一定的顺序,一般也不安排在程序的开头。
  2. 在初始化后的任何时候进行动态控制。

修改中断向量

当使用PC机的某个中断号时,需分三步修改:

  1. 用35H号功能,获取原中断向量。
  2. 用25H号功能,设置新中断向量,取代原中断向量。
  3. 新服务程序执行完毕后,利用25H号功能恢复原中断向量。

例:修改中断号为60H的中断向量。

1步:
MOV   AH,35H    ;取原中断向量
MOV   AL,60H    ;60H为原中断号
INT   21H            ;中断向量存到ES:BX
MOV   OLD_SEG,ES   ;保存原中断向量
MOV   OLD_OFF,BX
第2步:
MOV   AH,25H      ;设置新中断向量
MOV   AL,60H      ;中断号
MOV   DX,SEG INTRn    ;INTRn是新中断程序的入口地址
MOV   DS,DX      ;DS指向新中断程序段地址
MOV   DX,OFFSET INTRn ;DX指向新中断程序偏移地址
INT   21H              ;新中断向量存到向量表
第3步:
MOV   AH,25H       ;恢复旧的中断向量
MOV   AL,60H       ;中断号
MOV   DX,OLD_SEG
MOV   DS,DX       ;DS指向旧中断程序段基址
MOV   DX,OLD_OFF     ;DX指向旧中断程序偏移地址
INT   21H              ;旧中断向量存到向量表

发中断屏蔽/开放和中断结束命令

  • 在主程序中,用OCW1执行中断屏蔽与开放
开放IRQ2中断的方法:
    IN AL,21H     ;读IMR寄存器
    AND AL,0FBH   ;对应IRQ2的位置0
    OUT 21H,AL
关闭IRQ2中断的方法:
    IN AL,21H     ;读IMR寄存器
    OR AL,04H     ;对应IRQ2的位置1
    OUT 21H,AL
  • 在中断服务程序中,使用OCW2发中断结束信号EOI,使用IRET中断返回

编写中断服务程序

中断服务程序一般格式

INT-P PROC FAR
	PUSH …        ;保护寄存器的内容
       …
      PUSH …
 	STI
       …		   ;中断服务程序体
      MOV AL,20H    ;不指定中断结束方式
      OUT 20H,AL    ;发EOI命令,对微机
      POP …         ;恢复寄存器(与保护时的顺序相反)
       …
      POP …
	IRET           ;中断返回
INT-P ENDP

中断应用程序设计

中断的实际应用有两种情况:一是利用微机系统配置的中断资源,直接调用来开发自己的中断系统;二是用户自己设计的中断系统,通常是在单片机上或单板机上设计的中断系统。下面举例说明利用系统的中断资源来设计的中断应用系统的方法。

例:中断用于数据采集系统
(1)要求:从通道5采集1024个8位数据;数据以中断方式送缓冲区BUFR;结束信号EOC经GAL20V8组合后送IRQ9去中断请求;指定方式结束;A/D转换器ADC0809的选择端口地址320H,启动为321H,读数端口为322H;主片82C59A端口:OCW1端口为21H,OCW2端口20H;从片OCW1的端口0A1H, OCW2的端口为0A0H。
电路图:

(2)分析:
中断源:由ADC0809的转换结束信号EOC的上升沿申请中断。
中断:由于是从IRQ9引入中断请求,因此连到从片82C59的IR1端口,其中断号是71H; 82C59的两个端口地址是0A0H和0A1H。
操作:由于是主从结构的82C59中断控制,所以对主从片都要进行操作。
在程序设计时,按主程序和服务程序两个模块进行设计,而利用系统的中断资源,不需要进行初始化。


程序

	MOV	AX,3571H		;取原中断向量并保存
	INT	21H
	MOV	INT0A-OFF,BX
	MOV	BX,ES
	MOV	INT0A-SEG,BX
	CLI				;置新中断向量
	MOV	AX,2571H
	MOV	DX,SEG A-D
	MOV	DS,DX
	MOV	DX,OFFSET A-D
	INT	21H
	MOV	AX,DATA		;恢复数据段
	MOV	DS,AX
	STI	
	IN	AL,21H      ;开放从片中断(主片IR2)
	AND	AL,0FBH
	OUT	21H,AL
	MOV	DX,0A1H		  ;开放IRQ9
	IN	AL,DX
	AND	AL,0FDH
	OUT	DX,AL
;程序主体
	MOV	CX,1024		  ;设置采样次数
	MOV	AX,OFFSET BUFF
	MOV	POINT,AX		  ;设置内存指针
	MOV	DX,320H		  ;选择通道号
	MOV	AL,05H
	OUT	DX,AL
	BEGIN:MOV	  DX,321H		;启动转换
	MOV	AL,00H
	OUT	DX,AL
	STI				;开中断
	HLT				;等待中断
	DEC	CX			;修改采样次数
	JNZ	BEGIN			;没有结束,继续
	CLI				;恢复原中断向量
	MOV	AX,2571H
	MOV	DX,INT0A-SEG
	MOV	DS,DX
	MOV	DX,INT0A-OFF
	INT	21H	
	MOV	AX,DATA		;恢复数据段
	MOV	DS,AX
	STI
	IN	AL,21H		;屏蔽主8259
	OR	AL,04H
	OUT	21H,AL
	MOV	DX,0A1H		;屏蔽IRQ9
	IN	AL,DX
	OR	AL,02H
	OUT	DX,AL
	MOV	AX,4C00H		;返回DOS
	INT	21H	
	;中断服务程序
A-D	PROC	FAR
	PUSH	AX			;保护现场
	PUSH	DX
	PUSH	DI
	CLI				;关中断
	MOV	DX,322H		;读数据
	IN	AL,DX
	NOP
	MOV	DI,POINT		;存数据
	MOV	[DI],AL
	INC	DI
	MOV	POINT,DI		;修改指针
	MOV	AL,20H		;主片的中断结束命令
	OUT	20H,AL
	MOV	DX,0A0H 		;从片的中断结束命令
	MOV	AL,61H
	OUT	DX,AL
	POP	DI			;恢复现场
	POP	DX
	POP	AX
	STI				;开中断
	IRET
A-D	ENDP
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值