8086的中断机制

    8086在内存中00000H-003FFH这  1024个存储单元存放的是中断向量表,由256个表项被称为中断向量,所谓中断向量就是中断处理程序的入口地址,每个中断向量占4个字节,这是由原因的,8086的寄存器段地址和偏移地址都是16位的所有中断处理程序的入口地址需要4个字节存放。
    中断向量表不是说真的就是一张表,它只是内存的一段区域,并且只存放中断处理程序的入口地址。提到了中断还要必须提到的是中断类型码,中断有很多中,除法中断,按键中断,鼠标中断,单步调试中断等等,中断类型码就是用来区分中断类型的,0号中断时除法中断 ,9号中断是键盘输入中断,中断处理程序的地址 IP=(n*4) ,CS=(n*4+2)  处的值
    执行中断处理程序的过程

    1.取中断类型码n
    2.标志寄存器入栈  设置IF=0,TF=0
    3.CS,IP入栈	(2和3的是为了保存CPU的现场环境 )
    4.设置IP的值为  内存地址为n*4处的值   同理CS为n*4+2    (这里是方边大家更容易的理解才这么写的)
        设置IP,CS的值以后,它就指向的中断程序的入口地值,开始执行中断处理程序了,执行到iret指令之后CS与IP会指向原处,返回原程序
 int  n指令所做的就是执行n号中断处理程序,int n所也不过是按照上面的步骤所执行的,iret 所做的只是
 POP IP
 POP CS
 POPF    这样的功能
 我们可以完全不用int n指令和  iret   但是没有必要  它们是设计者给我们提供的方便,了解它们的具体是为了更好的了解底层工作的原理
 int n  指令的过程也就是
 pushf     (标志寄存器入栈)
 pushf 
 pop  ax
 and  ah,11111100B    设置    IF=0,TF=0    IF=0的目的是在执行中断例程的时候  CPU屏蔽可屏蔽中断,防止产生干扰
 push  ax
 popf	
 call  dword ptr  es:[bx]                       es:[bx]  必须为中断例程的入口地址      执行了这条指令后就跳转到就执行中断处理程序执行
 中断例程里会有iret可以让程序跳转原处,其实和  call 指令与ret (retf)配合使用实现子程序机制是相同的

至于那些中断例程都是保存在ROM只读存储器中的,中断例程的入口地址也都是保存在ROM,RAM的数据掉电丢失,CPU加电后自动从
FFFF:0单元开始行程序,FFFF:0是一条跳转指令 CPU指令该指令后会转去指令  BIOS基本输入输出系统的的初始化程序。

你可能感兴趣的:(8086处理器)