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:0000
到 0000:03FF
的 1024
个 单元中存放着中断向量表,中断向量表只能放在这里。
那么在中断向量表中,一个表项存放着一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址存放偏移地址。
中断过程大致如下:
(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 n
,n
为中断类型码,上面已有提及过,执行过程如下
(1)取中断类型码 n;
(2)标记寄存器入栈,if = 0,tf = 0;
(3)CS、IP 入栈;
(4)(IP)=(n*4),(CS)=(n*4+2)
(5)执行 n 号中断处理程序