中断源及外部可屏蔽中断的控制逻辑
' B9 I" B* @/ a$ H6 O7 V 图5.22所示是Pc/AT机中断源总的示意图。从中断源来自CPU外部还是内部,可分成外部中断和内部中断两大类。外部中断从两根请求线引入CPU,通过NMI引入的是非屏蔽中断请求,从INTR引入的是可屏蔽中断请求。在PC/AT机中,可屏蔽中断源都是一些“设备”,它们的中断请求由两片8259A级联系统来控制,如图5.23所示。
- w$ \: A( k" z8 |
在Pc/AT机中,主8259A占用端口地址20H和21H,从8259A占用端口地址AOH和 AlH。
. }" l! \' P' E1 ^3 E2 y: b 在与Pc/AT兼容的高档微机中,采用了图5.23所示的逻辑(集成到多功能接口芯片或控制芯片组中芯片),在中断控制中仍使用上面4个端口地址。
( a* w* b8 e- j% ^, Y) j5 U
1.外部中断源
: T; Y" C3 M, ^; ]
(1)非屏蔽中断
% c: I0 _% ]$ R8 |# x
: K2 T: y+ `. k) v: \
; X3 V0 n v% B- y9 _3 N' l# u
2 q- U+ q1 U; A8 D# r6 }
) [, [6 q0 @- R" G1 V2 P+ g; { 在Pc/AT机中,存储器奇偶校验错等致命错误是非屏蔽中断源。电源掉电并未列入其中,因为电源掉电的处理需要借助于不间断电源(uPS)功能块,以保证中断服务期间的供电。在响应非屏蔽中断请求时,CPU自动形成中断类型号2。
2 J" m3 g% L& w5 }9 [7 @' f (2)可屏蔽中断
5 o1 S" a+ `; t4 c0 x2 O3 z1 ^8 k 在PC/AT机中,可屏蔽中断从主板或系统总线(ISA总线)插槽引人,其中断源的设置见表5.2。其中一些中断源并未列出,是为用户所保留的。一般机器只配一台打印机,使用并行口l,所以并行口2一般不用,IRQ 5可由用户使用。IRQ9标注有“改向”,这是为了保持与PC/XT机的兼容。在PC/xT机中仅用了一片8259A,PC/AT机中的主8259A就是与它对应的。在Pc/AT机中主片的IRQ2用于级联,原来在PC/xT机中接到IRQ2上的设备,在机器更新时,可接到PC/AT机的IRQ9。如该设备产生中断请求,中断类型号为7lH的中断服务程序(对应IRQ9)将自动转移到中断类型号为0AH的中断服务程序(对应IRQ2)。这样,原先在PC/XT机上使用IRQ2的程序不必修改,在PC/AT机上照样可以运行。对于外部可屏蔽
$ A4 y F/ I: v- w p
中断,在中断响应时,要经过两个中断响应周期,由8259A产生相应的中断类型号。
6 t1 o$ k- {) b' f
, R5 o* R4 {$ p* |! x! g
+ c. d$ D5 X5 T. x; ^% b
g! | k2 v. o; D; Q' x9 ^
& h- R8 X- T& {5 X r) _ 2.内部中断源
7 A6 S) _- y0 F$ \$ q- I2 [! w) X 在CPU执行程序时,遇到一些特定的情况也会引起中断,这些情况(或叫事件)统称为内部中断源。内部中断源有以下四种:
- D+ j" H6 }4 ~$ j4 q9 @
1)除法错中断
! J3 f% \3 V6 H$ N
当进行除法运算时,发现除数为O或商超过了寄存器所能表示的范围,CPU自动产生中断类型号为0的中断。
+ `5 o5 m! K% J2 o/ P
2)溢出中断
6 q/ m6 q# a* s 在运算的过程中,如果运算的结果超出了相应数据的表示范围,就会产生溢出。在出现溢出时,并不立即引起中断,而是置位标志寄存器的溢出标志OF。当CPU执行溢出中断指令INTO时,发现OF被置位,才产生中断类型号为4的中断。因此,如果觉得本次运算有可能溢出,应在它的后面安排一条INTO指令。在执行INTO指令时,如果OF没有被置位,则不进行任何操作。
8 w6 C& m# F* D5 d3 |+ N! \
3)单步中断
3 p- P( B5 ]: D. `3 P3 Y8 C: j* a 单步运行是调试程序的一种常用方式。要单步运行,需要将标志寄存器中的单步标志TF置1。在TF为1的情况下,CPU在每条指令执行后产生类型号为1的中断。在单步中断服务程序中显示一些内部寄存器的值和一些附带信息,供程序员观察和分析指令的执行结果。注意,在单步中断服务程序中执行时并不是单步方式(也不应该是单步方式)。这是因为在所有类型的中断处理过程中,CPU都是先把标志寄存器的内容自动压入堆栈,然后清除TF和IF。因此,CPU在进入单步中断服务程序时,它就不再处于单步方式了,而是按正常的方式执行中断服务程序,只有当单步中断服务程序结束时,从堆栈中弹出原来的标志后才使CPU又回到单步方式。
* o4 u& Z5 A" ^1 d5 c5 C) C9 y
4)软中断(又称软件中断,或指令中断)
0 P" U; X9 B2 I9 W; Q CPU在执行中断指令INT n时,产生一个类型为n的中断,这就是前面所说的用软件方法引起中断。
* i* o+ _: Z$ j
需要特别提一下类型为3的中断指令(INT 3),类型3为断点中断。这里所说的断点,是指在程序执行过程中人为设置的,实际上是一条INT 3指令。执行到该指令时,转入类型3的中断服务程序,在该服务程序中显示寄存器的内容和部分内存单元的内容。这样,程序员就可确定到断点之前的一段程序是否正确,是否需要修改。在程序中设置断点也是常用的程序调试方法,而调试程序DEBUG(用于调试汇编语言程序)和一般的高级语言开发平台都提供设置断点的手段(程序员不必亲自在程序中加入INT3指令)。需要指出的是,系统并未提供断点中断服务程序,通常由调试程序DEBUG和高级语言开发平台来提供。
- R( a9 T7 s# i# o INT n执行时,标志寄存器的内容被压入堆栈,然后IF和TF被复位,接着,CS和IP的内容也被压入堆栈,堆栈指针减6,由中断类型号乘以4得到存放中断向量的起始地址,并将中断向量的低位字和高位字送到IP和cs中。这样下一条要执行的指令就是中断服务程序的第一条指令。
6 Q# G# P, F E" r; }# ^2 [ 3.各类中断的优先级别
: f; y2 i3 l$ M4 Y" A& k* Y1 x 在Pc/AT机中,各类中断的优先级见表5.3,其中内部中断的优先级别最高(单步中断除外),其次是不可屏蔽中断,单步中断的优先级别最低。
9 F0 `$ l# o8 R4 u+ t' J3 a4 C" B
; t- Y' F% l& e# H