80X86中断系统(1)
中断系统
CPU采用中断方式与外设进行信息交换(使得CPU效率大幅提高)
- CPU启动输入设备,让输入设备准备数据
- CPU执行现行程序
- 当输入设备准备好数据时,将数据送至输入接口。
- 输入接口向CPU发送中断请求。
- CPU根据自己的情况,决定是否响应中断请求。
- 当CPU响应中断请求后,CPU会暂停当前的现行程序,去执行中断服务子程序。
- 中断服务子程序会将输入接口的数据读入CPU
- 当中断服务子程序执行结束后,CPU会接着之前的断点继续执行现行程序
中断定义:在CPU执行程序的过程中,由于外部或内部的事件作用,使得CPU当前执行的程序站而去执行中断服务子程序,再执行完后又能自动返回的被中断的程序中继续执行的过程。
被中止的程序——主程序
主程序被中止的地方——断点(下一条指令的地址)
中断源:能够引发CPU中断的信息源。
(1)、外部中断源(硬件中断源)
I/O设备:键盘、显示器、打印机
数据通道:硬盘、磁盘
时钟:0号计数器、8254引发的中断
故障源:掉电、存贮器奇偶校验错
(2)、内部中断源(软件中断源)
INT中断指令:如执行INT 21H
CPU执行指令产生异常:如被0除、单步执行
中断分类:
(1)、外部中断(硬件中断)
由CPU以外的设备发出,并从CPU的中断请求信号引脚输入引发的中断称为外部中断。
80X86CPU有两个中断请求信号引脚(INTR和NIMI)
INTR:由输入到INTR引脚的中断信号引发的中断称为可屏蔽硬件中断。
NMI:由输入到NMI引脚的中断信号引发的中断称为非屏蔽硬件中断
当中断开时,非可屏蔽中断源一旦提出请求,CPU必须无条件响应,而对于可屏蔽中断源的请求,CPU可以响应,也可 以不响应。
(2)、内部终端(软件中断)
由CPU硬件故障或程序执行中的事件引发的中断称为内部中断
软件中断:执行INT n指令引发的中断。
BIOS中断:
DOS中断:
1、DOS专用中断
2、DOS保留中断
3、用户可调用的DOS中断
4、保留给用户开发的DOS中断
异常:由CPU本身的故障、程序故障引发的中断
除法错中断:当除法结果溢出或者除数为0时,发生的中断
单步或陷阱中断:执行每条指令后,如果标志寄存器的T标志(陷阱标志)为1则产生中断。
中断类型码:用于区别不同类型的中断,给每一个类型的中断分配一 个中断号n(0——255)
Intel保留了前32种中断(0——31)为系统专用
后224个可以由用户自己设定
0型中断 |
除法错中断 |
1型中断 |
单步或陷阱中断 |
2型中断 |
非屏蔽型硬件中断 |
3型中断 |
断点中断 |
4型中断 |
溢出中断 |
5型中断 |
屏幕打印 |
08H-0FH型中断 |
可屏蔽型硬件中断 |
10H-1FH型中断 |
BIOS中断 |
20H-3FH型中断 |
DOS中断 |
中断向量:在实模式下,中断服务子程序的入口地址。由两部分组成
中断服务子程序所在代码段的段基址:2个字节
中断服务子程序入口的偏移地址:2个字节
中断向量表:终端类型码通过一个地址指针表与中断服务子程序的入口地址联系:
实模式下:该表称为中断向量表
向量表设置在系统RAM的最低1K单元
(00000H-003FFH)
00000H |
0型中断向量 |
|
|
00004H |
1型中断向量 |
|
|
··· |
··· |
|
|
4*n |
N型中断向量 |
4*n+0:n型服务子程序入口的偏移地址(低八位) |
|
4*n+1:n型服务子程序入口的偏移地址(高八位) |
|||
4*n+2:n型服务子程序入口的段基址(低八位) |
|||
4*n+3:n型服务子程序入口的段基址(高八位) |
|||
··· |
··· |
|
|
003FFH |
255型中断向量 |
|
|
例子:08H型中断向量存放位置:20H——23H
08H*4=20H
保护模式下:该表称为中断描述符表
中断向量表的初始化:
由BIOS和DOS设计的中断服务子程序由BIOS和DOS各自负责写入中断向量表
由用户开发的中断服务子程序,由用户自己写入中断向量表
用户如何向中断向量表写入中断向量?
方法一:用户自己编写程序填写中断向量
CLI (关闭中断)
PUSH DS (将DS寄存器重点内容压入堆栈进行保存)
MOV AX, 0000H
MOV DS, AX
MOV BX, 4*n
MOV AX, OFFSET SERVICE(获取SERVICE的偏移地址)
MOV [BX], AX
MOV AX, SEG SERVICE (获取SERVICE程序的段基址)
MOV [BX+2], AX
POP DS (恢复DS中的内容)
STI (打开中断)
方法二:DOS设计的两个子程序,专用于中断向量的读出和写入
INT 21H的35H子功能:读出n型中断向量
入口:AL=中断类型码
出口:ES:BX=n型中断向量
INT 21H的25H子功能:写入n型中断向量
入口:DS=中断服务子程序所在代码段的段基址
DX=中断服务子程序入口的偏移地址
AL=中断类型码
出口:无
CLI (关闭中断)
PUSH DS (将DS寄存器重点内容压入堆栈进行保存)
PUSHA
MOV AX, SEG SERVICE
MOV DS, AX
MOV DX, OFFSET SERVICE
MOV AH, 25H
MOV AL, n
INT 21H
POPA
POP DS (恢复DS中的内容)
STI
中断响应及处理过程:微机系统处理不同类型的中断的响应和处理过程不完全相同,主要时中断类型码的获取方式不同。
非屏蔽硬件中断请求:CPU自动产生中断类型码2
可屏蔽中断请求:
CPU处于开中断状态:由外部中断控制器将相应的中断类型码 送给CPU。
异常:由CPU自动生成中断类型码
INT n指令:指令中的n即中断类型码
获取中断类型码后的处理过程:
1、将F寄存器(标志寄存器)压入堆栈、(保存中断处理前的F状态)
使F寄存器的T标志置0——禁止单步操作
I标志置0——使CPU处于关中断的状态
2、断点地址压入堆栈
先:将断点的基地址(CS)压入堆栈
后:将断点的拍偏移地址(IP)压入堆栈
3、CPU从4n—4n+3单元去除n型服务子程序的入口地址
将n型服务子程序的入口地址送入CS:IP
转入n型中断服务子程序执行
4、中断服务子程序执行完毕,执行中断返回指令(IRET)
按顺序恢复断点处的IP值、CS值和之前保存的F寄存器的内容
CPI根据恢复后的CS:IP返回断点,继续执行主程序
中断服务子程序结构
中断优先与中断分级:
当多个中断源在同一时刻提出请求时,CPU对中断响应的次序称为中断优先级。
中断类型 |
优先级 |
除法错中断 |
最高 |
软件中断(INT n) |
↓ |
断点中断 |
↓ |
溢出中断INTO |
↓ |
非屏蔽硬件中断(NMI) |
↓ |
可屏蔽硬件中断(INTR) |
↓ |
单步中断 |
最低 |
禁止中断:产生中断请求后,CPU不能中断现行程序的执行
中断屏蔽:用程序有选择地封锁部分中断,而允许其他部分仍可得到响应
中断嵌套:在执行中断服务程序时,仍可再响应中断请求。
中断指令:
开中断指令:STI
使F寄存器I标志置1,CPU处于开中断状态
关中断指令:CLI
使F寄存器I标志置0,CPU处于关中断状态
I标志置0或1只对可屏蔽硬件中断有作用
软件中断指令:INT n
无条件的转向n型中断服务子程序
中断返回指令:IRET
依次从栈顶弹出6个元素到CS:IP,F。
如果栈顶是INT n的断点地址,那执行IRET后可以返回断点,否则不能
溢出中断指令:INTO
先判断O标志位是否为1,如果是,那么调用类型为4的中断子程序,用于处理中断