内中断的产生
- 中断是CPU处理外部突发事件的一个重要技术。
- 它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。
- 引起中断的原因或者说发出中断请求的来源叫中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。
- 外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断。也就是说,利用中断控制器可以屏蔽这些外部设备的中断请求。
- 内部中断是指因硬件出错(如突然掉电、奇偶检验错等)或运算出错(除数为0,运算溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。
- 软件中断其实不是真正的中断,它们只是可被调用执行的一般程序以及DOS的系统功能调用(INT 21H)等都是软件中断。
- CPU为了处理并发的中断请求,规定了中断的优先权,中断优先权由高到低的顺序是:
- (1)除法错、溢出中断、软件中断
- (2)不可屏蔽中断
- (3)可屏蔽中断
- (4)单步中断
中断处理程序
- CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU根据中断信息可以找到要执行的处理程序。
- 中断为多任务做了垫基。多任务处理就是将CPU分成一个个相等的时间片。
- 我们知道,中断信息中包含有标识中断源的类型码。根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。
- 比如CPU根据中断类型码4,就可以招到4号中断的处理程序
中断向量表
- 可随之而来的问题是,若要定位中断处理程序,需要知道她的段地址和偏移地址,而如何根据8位的中断类型码(8086中断类型码为一个字节)得到中断处理程序的段地址和便宜地址呢?这就要引入“中断向量表”了
- CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
- 那么什么是中断向量表,中断向量表就是中断向量的列表。就是一个索引
- 中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口。
- 中断向量表在内存中存放,对于8086PC机。中断向量表指定放在内存地址0处。
- 从内存0000:0000到0000:03ff的1024个单元中存放着中断向量表。
- 0:200-0:300是内存的安全区
中断过程
- 从上面的讲解中,我们知道,可以用中断类型码,在中断向量表中找到中断处理程序的入口。
- 找到这个入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序。
- 用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。
- CPU硬件完成这个工作的过程被称为中断过程
- 8086CPU的中断过程:
- 从中断信息中取得中断类型码 —》 标志寄存器的值入栈保护标志位 —》设置标志寄存器的第8位TF和第9位IF的值为0 --》CS的内容入栈 —》 IP的内容入栈 —》从内存地址为中断类型码4和中断类型码4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。—.》执行中断程序
- 可以看到CPU将CS、IP保存在栈中。
- 取得中断类型码N
- pushf
- TF = 0 、IF = 0
- push CS
- push IP
- IP = 4N CS = (4N+2)
- 在最后一步完成后,CPU开始执行由程序员编写的中断处理程序。
中断处理程序
- 由于CPU随时都可能检测到中断信息,也就是说,CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存某段空间之中。
- 常规处理步骤:
- 保存用到的寄存器
- 处理中断
- 恢复用到的寄存器
- 用iret指令返回。
- iret指令的功能就是:
- pop IP
- pop CS
- popf
- iret通常和硬件自动完成的中断过程配合使用。
除法错误中断的处理
- 就是0号中断。
编译处理 0 号中断
安装
do0
设置中断向量
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset do0
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do0end - offset do0
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0
mov ax,4c00h
int 21h
do0:
jmp short do0start
db 'Love TangYanFen'
do0start:
mov ax,cs
mov ds,ax
mov si,202h
mov ax,0b800h
mov es,ax
mov di,12*160+36*2
mov cx,16
s: mov al,[si]
mov es:[di],al
inc si
add di,1
mov al,02h
mov es:[di],al
add di,1
loop s
mov ax,4c00h
int 21h
do0end: nop
code ends
end start
单步中断
什么是单步中断?
CPU为什么要提供这样的功能呢?
Debug只能说利用了CPU提供的一种功能
只有在CPU提供了在执行一条指令后就转去做其它事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。
CPU在执行完一条指令之后,如何检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。
单步中断的中断类型码为1,则它所引发的中断过程如下: