Content #
中断信号来自哪个引脚,8259 芯片是最清楚的,所以它会把对应的中断号告诉处理器,处理器拿着这个中断号,要顺序做以下几件事。
- 保护断点的现场。首先要将标志寄存器FLAGS 压栈,然后清除它的IF 位和TF 位。接着,再将当前的代码段寄存器CS 和指令指针寄存器IP 压栈。
- 执行中断处理程序。由于处理器已经拿到了中断号,它将该号码乘以4(每个中断在中断向量表中占4 字节),就得到了该中断入口点在中断向量表中的偏移地址。接着,从表中依次取出中断程序的偏移地址和段地址,并分别传送到IP 和CS,自然地,处理器就开始执行中断处理程序了。注意,由于IF 标志被清除,在中断处理过程中,处理器将不再响应硬件中断。如果希望更高优先级的中断嵌套,可以在编写中断处理程序时,适时用sti 指令开放中断。
- 返回到断点接着执行。所有中断处理程序的最后一条指令必须是中断返回指令iret。iret没有操作数,执行这条指令时,处理器依次从栈中弹出数值到IP、CS 和标志寄存器。顺便提醒一句,由于中断处理过程返回时,已经恢复了FLAGS 的原始内容,所以IF 标志位也自动恢复。也就是说,可以接受新的中断。
和可屏蔽中断不同,NMI 发生时,处理器不会从外部获得中断号,它自动生成中断号码2,其他处理过程和可屏蔽中断相同。