PART1:前言
int n指令的格式为:int n,n为中断类型码
cpu执行int中断,实际上就相当于引发一个n号中断的中断过程,他的大致执行过程如下:
- 取中断类型n
- 标志寄存器入栈,置IF=0,TF=0
(为什么要这一步,后面有解释)
// 这一步可以模拟为
pushf //标志寄存器入栈
;下面的步骤完成置IF和TF
pushf
pop ax
and ax,11111100B
push ax
popf //置IF=0,TF=0
- CS和IP入栈
- 令IP=(n*4),CS=(n*4+2)
8086的中断向量表是放在0地址处的,而每一个中断向量由两个字组成,低位字存放IP值,高位字存放CS值,所以上面的赋值就完成了跳转到中断处理程序的功能
为什么中断时要处理TF
和IF
的值?
TF位
:CPU提供的单步中断支持
cpu在执行完一次指令后,如果检测到标志寄存器TF=1,则产生单步中断,引发中断过程。单步中断的中断类型码为1
,也就是说:cpu在执行完一条指令后,如果检测到TF=1,那么就会转去执行1号中断处理程序。
作用:为单步调试程序提供支持,例如debug的t命令
IF位
:外中断之可屏蔽中断与不可屏蔽中断
IF=1:CPU在执行完一条指令后会检测有无外中断产生,并且响应这个外中断,如键盘鼠标等的输入
IF=0:CPU在执行完一条指令不会响应可屏蔽中断
相关指令
sti 设置IF=1
cli 设置IF=0 (close interupt)
PART2:编写并安装0号中断处理程序(除法溢出中断程序)
本来是想写9号中断处理程序的,有一些错误没处理好
1.安装
安装过程就是,先保存原来的中断处理程序的CS和IP,然后通过movsb指令将我们写的程序传送到0000:0200处,然后更改0号中断向量表的地址指向我们安装的程序地址。
s段就是我们自己写的中断处理程序,当发生溢出时会在屏幕上打印一个绿色的a,最后三行是通过retf
指令调用了原来的0号中断处理程序