8086中断处理过程

当外设向CPU发送可屏蔽中断请求:

1)8259中断控制器通过INTR信号线发送高电屏请求信号

2)CPU在每执行一条指令的最后一个时钟周期时会采样INTR信号线判断有无新的中断请求,如果INTR标志为1(也就是有中断请求)CPU就会首先判断IF标志位,如果为1,CPU就允许中断响应。IF=0就忽略该中断。

3)IF=1,CPU通过INTA(这里表示上划线,因为笔者不知道怎么设置上划线)信号线向8259发送两个连续负脉冲的中断响应信号。第一个信号表示CPU准备好接收中断类型码,第二个信号告诉8259中断控制器发送中断类型码。当中断控制器收到第二个信号时就会通过数据线将中断类型码发送给CPU。CPU就凭借着中断号从中断向量表中找到对应的中断函数地址(中断向量表是一个结构体数组,其中每个结构体中记录了CS:IP的值,结构体中低2字节记录CS段地址,高2字节记录IP偏移地址)

4)CPU找到中断函数后就会暂停当前执行中的程序,将新的CS:IP加载到寄存器,跳转到中断函数首地址去执行。这个过程中CPU还需要按顺序做以下处理:

                         1、将标志寄存器FR的当前值压入堆栈

                         2、将标志寄存器的中断允许标志位IF和单步标志位TF设置为0。IF=0,是为了屏蔽其他同级可屏蔽中断(如果是比

                         当前中断高级那么IF=0就失效了);TF=0,为了避免进入服务函数以单步形式执行(怕影响执行效率)

                         3、保护断点,将当前CS:IP压入堆栈保存,以便执行中断函数后返回

                         4、根据中断号找到中断函数首地址,将获得的CS:IP加载进寄存器

                         5、执行前还要压入各个寄存器的值进入堆栈,防止中断程序破坏现场。中断程序执行完成后再恢复寄存器的值并

                         设置IF=1

                         6、返回断点,中断服务结束后最后一条指令是IRET(中断返回指令),该指令将保存在堆栈中的断点值和寄存

                         器FR的值弹出堆栈,将CS:IP还原成中断前的值。

 

你可能感兴趣的:(随笔)