第12章:内中断
中断:CPU在执行当前正在执行的指令后,检测到从CPU内部或者外部产生的信息,便立即执行收到的信息。用来处理中断信息的程序是中断处理程序。
CPU收到中断信息后,要知道中断信息的来源(CS,IP值)。中断来源由中断类型码标识。中断类型码为一个字节的数据,所以可以有256种中断信息来源。CPU由8位的中断类型码,在中断向量表中查找,找到中断处理函数的入口地址(CS,IP)。中断向量表指定从内存地址0开始,256*4=1024单元(0000:0000~0000:03ffh)的内容是中断向量表。
CPU在以下情况产生中断:
(1)除法错误,比如,执行div指令产生除法溢出。:中断类型码:0
(2)单步执行:中断类型码:1
(3)执行into指令:中断类型码:4
(4)执行int指令。:指令格式为int n,n为字节型立即数,提供给CPU的中断类型码。
/
中断过程:
使用中断类型码,在中断向量表中找到中断处理程序的入口,设置CS:IP。这工作由CPU硬件自动完成。
8086CPU收到中断信息后:
(1)取得中断类型码N
(2)pushf
(3)TF=0,IF=0
(4)push cs
(5)push ip
(6)ip=(N*4),CS=(N*4+2)
以上CPU硬件自动完成,完成最后一步后,CPU执行由程序员编写的中断处理程序。
中断处理程序编写:
(1)保存用到的寄存器(2)处理中断(3)回复寄存器(4)iret指令返回。
iret<=>pop ip pop cs popf
编写0中断处理函数(实验12)
CODES SEGMENT
START:
;将中断处理函数放入安全的内存区
mov ax,cs
mov ds,ax
mov ax,offset d0
mov si,ax
mov ax,0
mov es,ax
mov di,200h
mov cx,offset d0end - offset d0
cld
rep movsb
d0:;中断处理函数
jmp short d0start
db "overflow!"
d0start:;中断处理函数,将字符串送进显存
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,9
s:
mov al,[si]
mov es:[di],al
inc si
add di,2
loop s
mov ax,4c00h
int 21h
d0end:
nop
CODES ENDS
END START
单步中断:执行一条语句后,进入中断,为实现单步跟踪提供机制。
CPU在执行一条指令后,如果检测到TF=1,则执行单步中断。如果在进入中断处理程序之前没有将TF位置零,CPU在执行一条指令后,又将进入中断,无限轮回233,所以这是将TF位清零的原因。
响应中断特殊情况:。执行完向ss寄存器传入数据指令后,即便发生中断,CPU也不响应。因此我们要将设置ss和设置sp连续存放。