DSP

(五)中断

2019-07-13 12:54发布

1、内中断的产生

CPU 的内部发生某些需要立即处理的的事情时,就会发出内部中断信息。
除法错误,比如执行 div 指令产生的除法溢出;
单步执行;
执行 info 指令;
执行 int 指令。
CPU 要进行不同的处理,首先要知道中断信息的来源,所以中断信息必须包含识别来源的编码,我们称为中断类型码,8086 CPU中断类型码为一个字节型数据,可以表示 256 种中断信息的来源,简称中断源。在 8086 CPU 中,上述的 4 种中断源表示如下:
除法错误:0
单步执行:1
执行 info 指令:4
执行 int 指令,该指令的格式为 int n ,指令中的 n 为字节型立即数,是提供给 CPU 的中断类型吗。

2、中断向量表

8086 CPU 接收到中断信息后,用 8 位的中断类型码通过中断向量表找到相应的中断处理程序入口地址;中断向量表在内存中存放着,对于 8086 PC 机,中断向量表指定放在内存地址 0 处,从内存 0000:00000000:03FF1024 个 单元中存放着中断向量表,中断向量表只能放在这里。
那么在中断向量表中,一个表项存放着一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址存放偏移地址。
中断过程大致如下:
(1)取得中断类型码
(2)pushf 标志寄存器入栈
(3)tf = 0, if = 0 设置标志寄存器的第 8 位和第 9 位的值为 0
(4)push cs CS 入栈
(5)push ip IP 入栈
(6)(ip) = (n*4), (cs) = (n*4+2) 从内存地址为中断类型码 4 中和中断类型码 4+2 的两个字单元中读取中断处理程序的入口地址。
(7)执行中断程序
例:重新编写一个 0 号中断处理程序,它的功能是在屏幕中间显示 overfliw! 然后返回到操作系统assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 ;设置ds:si指向源地址 mov ax,0 mov es,ax mov di,200h ;设置 es:di 指向目的地址 mov cx,offset do0end-offset do0 ;设置 CS 为传输长度 cld ;设置传输方向为正 rep movsb mov ax,4c00h int 21h do0:jmp short do0start db "overflow!" do0start: mov ax,cs mov ds,ax mov si,202h ;设置 ds:si 指向字符串 mov ax,0b800h mov es,ax mov di,12*160+36*2 ;设置 es:di 指向显存空间的中间位置 mov cx,9 ;设置 CX 为字符串长度 s:mov al,[si] mov es:[di],al inc si loop s mov ax,4c00h int 21h do0end:nop code ends end start

3、int 指令

int 指令的指令格式为:int nn 为中断类型码,上面已有提及过,执行过程如下
(1)取中断类型码 n;
(2)标记寄存器入栈,if = 0,tf = 0;
(3)CS、IP 入栈;
(4)(IP)=(n*4),(CS)=(n*4+2)
(5)执行 n 号中断处理程序