首页 > 代码库 > 内中断

内中断

1.CPU根据中断码如何找到中断处理程序

要定位中断处理程序,就需要找到中断处理程序的段地址和偏移地址,如果根据中断码找到他们?这就引入中断向量表,CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。

2.使用中断类型码找到中断向量,并用它设置CS和IP,这个操作是由CPU硬件自动完成的。这个过程成为中断过程:

(1)从中断信息中取得中断类型码

(2)标志寄存器的值入栈(保护标志位)

(3)设置标志寄存器的TF和IF为0

(4)CS、IP入栈

(5)从内存地址中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序入口地址

3.中断处理程序

由于CPU随时都可能检测到中断信息,也就是说,CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存某段空间之中。

中断处理程序的编程步骤:

1)保存用到的寄存器

2)处理中断

3)恢复寄存器

4)用iret指令返回

iret指令用汇编语法描述为:

pop IP

pop CS

popf

iret通常和硬件自动完成的中断过程配合使用。可以看到,在中断过程中,寄存器入栈的顺序是标志寄存器、CS、IP,而iret出栈顺序是IP、CS、标志寄存器,刚好和其相对应,实现了用执行中断处理程序前的CPU现场恢复标志寄存器和CS、IP的工作,而iret执行后,CPU回到执行中断处理程序前的执行点继续执行。

4.中断指令举例,我们修改7ch中断码对应的中断程序,将7ch对应的中断处理程序修改为求word型数的平方

assume cs:code
code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset sqr
	mov ax,0
	mov es,ax
	mov di,200h
	mov cx,offset sqrend-offset sqr
	cld
	rep movsb ;将sqr程序移动到8086的安全控件0:200处
	
	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h ;修改中断向量表项的IP
	mov word ptr es:[7ch*4+2],0	 ;修改中断向量表项的CS
	
	mov ax,4c00h
	int 21
	
sqr:mul ax
	iret
sqrend:nop
code ends
end start