12.0 概述
任何一个通用的CPU,都具备处理中断信息的能力.中断的意思是指:CPU不再接着(刚执行完的指令)向下执行,而是转去处理"中断"这个特殊信息.
中断信息可以来自CPU的内部和外部,本章主要讨论内中断.
12.1 内中断的产生
对于8086CPU,当CPU内部有下面情况发生的时候,将产生相应的中断信息:
(1) 除法错误,比如执行div指令产生的除法溢出
(2) 单步执行
(3) 执行into指令
(4) 执行int指令
8086CPU使用>>中断类型码<<来标识这四种不同的中断信息来源(简称中断源),中断类型码有一个字节(可表示256种类型),上述四种中断源的类型码如下:
(1) 除法错误:0
(2) 单步执行:1
(3) 执行into指令:4
(4) 执行int n指令:n
12.2 中断处理程序
CPU收到中断信息后,需要对中断信息进行处理,不会调用中断处理程序.可以由我们自己编写,一般来讲对不同的中断信息需要不同的中断处理程序.
CPU需要在中断信息和中断处理程序入口地址之间建立联系,中断类型码的作用就是用来定位中断处理程序的.
12.3 中断向量表
中断向量,指中断处理程序的入口地址.中断向量表,就是一个中断向量的列表,也就是中断程序入口地址的列表.
CPU通过8位的中断类型码在中断向量表中找到中断处理程序的入口地址.
中断向量表在内存中存放,对于8086PC机,指定存放在内存地址0处,0000:0000到0000:03FF的1024个单元中存放着中断向量表.
对于8086CPU,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址.
12.4 中断过程
用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的,CPU完成这个工作的过程叫中断过程.
下面是8086CPU收到中断信息后,所引发的中断过程:
(1) 取得中断类型码N
(2) pushf
(3) TF=0,IF=0
(4) push CS
(5) push IP
(6) (IP)=N*4,(CS)=(N*4+2)
12.5 中断处理程序和iret指令
由于CPU可能随时检测到中断信息,也就是说随时可能执行中断处理程序,所以中断处理程序发布一直存储在内存某段空间中,而中断向量必须一直存在对应的中断向量表表项中.
中断处理程序的编写方法和子程序比较相似,常规步骤如下:
(10 保存要用到的寄存器
(2) 处理中断
(3) 恢复用到的寄存器
(4) 用iret指令返回,iret指令的功能可以用汇编语法描述为:
pop IP
pop CS
popf
iret指令执行后,CPU顺到执行中断处理程序前的执行点继续执行程序.
12.6 除法错误中断的处理(0号中断)
显示提示信息"Divide Overflow",然后返回操作系统
12.7 编程处理0号中断
我们需要做的事情:
(1) 编写可以显示"Overflow"的中断处理程序:假设为do0
(2) 将do0送入内存0000:0200处
(3) 将do0的入口地址0000:0200存储在中断向量表0号表项中
回忆一下,我们通过改变SS,SP,来使一段内存单元变成栈顶,通过改变CS,IP来使一段内存单元被CPU执行,同样,我们通过改写中断向量表,来使一段内存成为中断处理程序.
12.8 安装
将do0代码传送到0:200处,并设置中断向量表.
<> 可以利用编译器计算一段代码的长度,如: offset 标号2- offset 标号1 (编译器可识别表达式)
12.9 do0的编写
注:do0要显示的字符串"overflow!"也应该放在一段不会被覆盖的空间中.所以可在do0程序里定义这个字符串数据.
12.10 设置中断向量
0号表项的地址为0:0,其中0:0字单元存放偏移地址,0:2字单元存放段地址.
12.11 单步中断
CPU在执行完一条指令后,如果检测到标志寄存器TF标志为1,则产生单步中断,引发中断过程,单步中断的中断类型码为1.
例如Debug程序中的T命令,就会产生单步中断,CPU执行完一条指令后,显示寄存器状态并等待新命令的输入.
注:单步中断处理程序的第一步必将是把TF置为0,否则将陷入无限循环中.
12.12 响应中断的特殊情况
一般情况下,CPU在执行完一条指令后,如果检测到中断信息,就响应中断,引发中断过程.可是在某些特殊的情况下不会响应.
如在执行完向SS传送数据的指令完成之后,即使有中断发生,也不影响,因为SS:SP联合完成指向栈顶工作,如果在改变SS时发生中断而去处理中断,栈顶数据会不一致.
实验12 编写0号中断处理程序
略
转载于:https://www.cnblogs.com/AzikPhil/archive/2012/06/27/note_asm2_12.html