我们在8086编程时,当一个CPU内部中断或者外部中断来了,该去执行什么样的中断处理程序呢?因为我们知道CPU就是个小傻瓜,只能机械的跟着CS,IP走,所以一切的一切,包括中断机制都是我们编程人员编出来的。
下面我们看这个中断指令:int 0;
这是一个masm风格汇编的调用中断指令,中断类型代码为0,意思是说我们要调用一个中断类型代码为0的中断,然后让CPU去处理这个中断类型代码相对应的中断处理程序,处理完中断后返回。
这条指令看起来也太智能了吧,仅仅一条指令就能干那么多事情,其实,这么理解完全错了,我们要了解一个道理,对于每一个汇编指令,就如int 0这个指令,虽然仅仅一句话,但是当汇编成机械语言时,可不仅仅就一句话了,只不过汇编器帮我们做了很多事,对于这条指令,汇编器碰到这条指令会产生如下代码:
这里又得说一个中断向量表的概念:
我们一般约定俗成的在内存0X000处建立一个中断向量表,这个中断向量表每4个字节的储存一个中断类型的中断处理程序地址。就是这么个意思:
从内存地址0开始,前两个字节存放与中断类型代码0相应的中断处理程序地址的ip偏移地址,然后后两个字节存放中断处理程序地址CS段地址,其后依次是中断类型1,2,.....的中断中断处理程序地址。
这样,我们就可以通过中断类型代码,中断向量表找到此中断类型的处理程序了。
至于中断处理程序,一般是这样的一个流程:
iret指令相当于:
pop IP; pop CS; popf;
下面我们讲下内中断:
cpu内部中断上面几个,第一个,当除法错误时产生一个中断,中断类型为0,后面的单步执行这个是干嘛的呢?每当CPU执行完一跳指令后,检测到标志寄存器的TF位为1,那么就会产生一个单步中断,中断类型码为1,所以我们才有如上所示,当处理中断时,要将TF置0。
像int n,就是代表执行中断类型代码为n的中断。