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基本输入输出系统的的初始化程序。