8086中断知识以及编写0号中断处理程序

PART1:前言

int n指令的格式为:int n,n为中断类型码
cpu执行int中断,实际上就相当于引发一个n号中断的中断过程,他的大致执行过程如下:

  1. 取中断类型n
  2. 标志寄存器入栈,置IF=0,TF=0 (为什么要这一步,后面有解释)
// 这一步可以模拟为
pushf 	//标志寄存器入栈
;下面的步骤完成置IF和TF
pushf
pop ax
and ax,11111100B
push ax
popf	//置IF=0,TF=0
  1. CS和IP入栈
  2. 令IP=(n*4),CS=(n*4+2)
    8086的中断向量表是放在0地址处的,而每一个中断向量由两个字组成,低位字存放IP值,高位字存放CS值,所以上面的赋值就完成了跳转到中断处理程序的功能

为什么中断时要处理TFIF的值?

TF位:CPU提供的单步中断支持

cpu在执行完一次指令后,如果检测到标志寄存器TF=1,则产生单步中断,引发中断过程。单步中断的中断类型码为1,也就是说:cpu在执行完一条指令后,如果检测到TF=1,那么就会转去执行1号中断处理程序
作用:为单步调试程序提供支持,例如debug的t命令

IF位:外中断之可屏蔽中断与不可屏蔽中断
  • 可屏蔽中断:cpu可以不响应的外中断,具体响不响应看IF的值
  • 不可屏蔽中断:cpu必须立即响应的外中断,cpu会在当前指令执行完后立即响应该中断,不可屏蔽中断的类型码固定为2

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号中断处理程序

2.执行

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/adventural/article/details/108015730