中断程序介绍,
中断处理程序:由于cpu随时检测程序的中断信息,也就是执行中断程序,所以中断程序必须存储在内存某个段空间中
而中断处理程序的入口地址,即中断向量必须存储在对应的中断向量表表项中,通俗的讲就是中断处理程序的地址放在一块内存中,这块存储中断处理程序的入口的地址空间叫中断向量表,而实际地址就叫中断向量
中断处理程序的编写方法和子程序比较相似,下面是常规步骤(中断过程):
1保存用到的寄存器
2处理中断
3恢复用到的寄存器
4用iret指令返回
iret指令
iret指令功能用汇编语言描述如下:
pop ip
pop cs
popf 从栈顶弹出数据(之前保存的标志寄存器数据)送人标志寄存器
iret通常和硬件自动完成的中断过程配合使用,可以从上面看出中断过程中,寄存器的入栈顺序为,标志寄存器,cs,ip,刚好对应实现了用执行中断处理程序前的cpu现场恢复标志寄存器和cd,ip的工作,iret执行后,cpu回到执行中断处理程序前的执行点继续执行程序
举例0号中断处理过程,
当发生除法溢出时,产生0号中断信息,从而引发中断,此时PCU进行以下工作
1取得中断类型码0
2标志寄存器入栈,TF,IF设置为0
3cs.ip入栈
4(ip)=(中断类型码0*4),(cs)=(中断类型码*4+2)
8086cpu内存指定内存0000:0000——0000:03FF这1KB地址空间是系统存放中断处理程序入口地址的中断向量表,一般情况下,0000:0200——0000:02FF这256个字节空间所对应的中断向量表都是空的,操作系统和应用都不占用
中断向量表有1kB空间,8086CPU中断类型有256,每个中断占4个字节,保存中断程序的地址,
单步中断:DEBUG
CPU在执行完一条指令后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断,单步中断的类型码为1,它的中断过程如下:
1取得中断类型码为1
2标志寄存器入栈,TF,IF设置为0
3cs,IP入栈
4(IP)=(N(N等于中断类型码,单步中断类型码为1)*4) CS=(N*4+2)这是计算中断程序地址放在那一块内存保存,CS放在高位,IP放在低位
int指令
int指令:另一种内中断,由int指令引发的内中断
int格式:int n n为中断类型码,它的功能是引发中断过程
1取中断类型码n
2标志寄存器入栈,IF=0,TF=0
3 CS:IP入栈
4 (IP)=(n*4) (cs)=(n*4+2)
通过中断类型码索引到存在中断程序cs:ip的中断向量表的位置
BIOS中断例程
int 10h中断例程是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序,一般来说,一个中断例程有多个子程序,中断例程内部通过传递进来的参数来决定调用那个子程序,BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号
例子:
int 21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序
mov ah,4ch
mov al,0
int 21h 调用21h中断例程中ah=41h编号的子程序,这个子程序功能是程序返回,al时返回值