中断

1:中断和中断使用方式

中断和中断源:中断时使CPU挂起正在执行的程序而转去执行特殊事件的操作,这些引起中断的事件成为中断源

2:中断传送方式:

中断传送方式的具体过程是:当CPU需要输入或者输出数据时,先做一些必要的准备工作(有时包括启动外部设备),然后继续执行程序,当外设完成一个数据的输入或输出时,则向CPU发出中断请求,CPU就挂起当前执行的程序,转去执行输入或输出操作,在完成输入或输出操作后,返回源程序继续执行

3:中断传送方式是CPU与外部设备进行输入输出的有效方式,一直被大多数的计算机采用,他可以避免因为反复查询外部设备的状态而浪费时间,从而提高CPU的效率,不过,每中断一次,只传送一次数据,因此,传送数据的效率不是很高,所以中断一般用于低速外设

4:中断向量表

IBM PC 系列和他的兼容机能够提供256种类型的中断,系统给每种中断都安排一个中断类型,简称为中断类型号,中断类型依次是0~0FFH

每种类型的中断都是由相应的中断处理程序来处理,为了使cpu响应中断后,CPU能快速转入对应中断处理程序,系统用一张表来保存这些中断处理程序的入口地址,这张表就成为中断向量表,中断向量表的每一项保存一个中断处理程序的入口地址,它相当于一个指向中断处理函数的指针,因此,就称他为中断向量

5设置和获取中断向量表

在系统程序或者引用程序由于某些需要而提供新的中断处理程序时,就需要设置对应的中断向量,使其指向新的中断处理程序

下面举出可以直接设置中断控制向量的方法

………………
MOV AX,0
MOV DS,AX
MOV BX,N*4;准备设置n号中断向量
CLI  ;关闭中断
MOV WORD PTR[]BX],OFFSET INTHAND ;置偏移量
MOV WORD PTR[BX+2],SEG INTHAND;置段值
STI
………………

PTR是属性操作符,格式是 :类型 PTR 地址表达式这里只是临时性强制指定变量和标号的类型

SEG能够返回变量所在的段值的时候,例如MOV AX ,SEG VARW,把VARW所在的段值传递给AX

有的时候总避免采用上述直接设置中断向量的方法,而是利用DOS提供的25H号系统调用来设置中断向量

参数如下:

AL = 中断向量(类型)号

DS = 中断处理程序入口地址的段值

DX = 中断处理程序入口地址的偏移

下面程序片段设置n号中断向量,假设对应中断处理程序入口标号是INTHAND:

……………………………………
MOV AX,SEG INTHAND
MOV DS,AX
MOV DX,OFFSET INTHAND
MOV AH,25H
MOV AL,n
INT 21H
……………………………………

有时候需要取得中断向量,一般都是利用DOS提供的35H系统功能来调用中断向量

入口参数:

  AL = 中断向量(类型)号

出口参数:

  ES = 中断处理程序入口地址的段值

  BX = 中断处理程序入口地址的偏移

下面程序片段式取得n号的中断向量,并将其保存在双字节变量OLDVECTOR中

………………………………
MOV AH,35H
MOV AL,N
INT 21H
MOV WORD PTR OLDVECTORS, ES
MOV WORD PTR OLDVECTORS, BX
……………………………………

中断响应的过程

(1)取得中断类型号

(2)把标志寄存器压入堆栈

(3)禁止外部中断和单步中断

(4)把下一条要执行的指令地址压入堆栈

(5)根据中断类型好从中断向量表中取出中断程序的入口地址

(6)转去处理中断函数

中断返回指令

中断处理程序利用中断返回指令从对战中弹出返回地址和原标志值,中断返回指令的格式如下

IRET

外部中断:

由发生在CPU外部的某个事件引起的中断称为外部中断,如输入与输出设备和协处理器等引起的中断,外部中断以完全随机的方式出现在现行程序中

8086、8088有两条外部中断请求线,INTR接受可屏幕中断请求,NMI接受非屏蔽中断请求

内部中断

由发生在cpu内部的某个事件引起的中断称为内部中断,由于内部中断时CPU在执行某些指令时产生的,所以也成为软件中断,其特点是:不需要外部硬件的支持,不收中断允许标志IF的控制

(1)中断指令INT引起的中断,例如dos调用中断指令

INT 21H

(2)cpu遇到特殊情况引起的中断:比如出发错中断,CPU发现出数为0 ,或者是商超出范围,中断类型为0

(3)溢出中断:8086提供一条专门用来检测运算溢出的指令,该指令的格式如下INT0 

(4)用于程序调试的中断 比如单步中断,断点中断

中断处理程序的设计

A:外设中断处理程序

在开中断的情况下,外设中断的发生时随机的,在设计外设中断程序是必须注意到这一点,中断处理程序必须充分注意到这一点

 步骤:

1必须保护现场,这里的现场可以理解为中断发生时CPU各内部寄存器的内容,cpu在响应中断的时候,已把各个标志位和返回地址 压入到堆栈,所以保护现场是指通用寄存器的内容和除代码段寄存器外的其他三个段寄存器的内容,因为中断的发生是随机的,所以凡是中断处理程序中 重新赋值的哥哥寄存器的原有内容必须预先保护,保护的一般方法就是把它压入堆栈

2:尽快完成中断处理。中断处理必须尽快完成,所以外设中断中必须追求速度上的高效率,因为在进行外设中断处理时,旺旺不在响应其他外设的中断请求,因此必须快,一面影响对其他外设的中断请求

3:恢复现场,在中断处理完成后,依次恢复被保护寄存器原有的内容

4:通知中断控制器中断已经结束,如果应用需要,也可以提前告知中断控制器中断结束,这样做必须考虑到外设中断的嵌套

5:利用IRET返回中断

B 软中断处理程序 

由中断指令一起的软件中断尽管是不可屏蔽的,但他不会随机发生,因此软中断处理的主要步骤如下 :

(1)考虑切换堆栈

(2)及时开中断

(3)应该保护现场

(4)完成中断处理

(5)恢复现场

(6)堆栈切换

 (7)一般利用IRET指令实现中断返回

 版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3715856.html

原文地址:https://www.cnblogs.com/fengdashen/p/3715856.html