8086中断处理程序分析

来源:互联网 发布:js对象 extend 编辑:程序博客网 时间:2024/06/11 07:08

中断程序介绍,

中断处理程序:由于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时返回值