汇编语言-中断-1
任何一个CPU,都可以在执行当前指令后收到另外一个信息来对新的信息来处理。
中断是意思就是CPU不在继续向下执行,而是转到处理别的信息。
中断信息可以是CPU的内部和外部、
外部中断一般是指由计算机外设产生的中断请求,如:键盘中断,打印机中断等等
内部中断是指因硬件出错(如突然断电、奇偶校验码出错等等)或者是运算出错 常用有以下(运算出错):
1.除法错误,比如div产生的除法溢出
2 单步执行
3 执行into指令
4 执行int指令
CPU为了处理并发的中断请求,规定了中断的优先权:由高到低是1:出发错,溢出中断,软件中断 2:不可屏蔽中断 3:可屏蔽中断 4 单步中断
中断处理程序
CPU收到中断信息后,需要对中断信息进行处理。CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU根据中断信息可以找到要执行的处理程序
中断信息中包含有标识中断源的类型码,根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。比如说CPU的中断类型码为5,就可以找到5号中断处理程序。可是要定位中断处理程序,需要知道段地址和便宜地址,那么如何根据中断类型码得到中断处理程序的段地址和偏移地址。这个就是中断向量表了
中断向量表
在CPU中用中断类型码通过中断向量表找到相应的中断处理程序的入口地址。相当于一个索引,通过索引来找到程序的入口。
中断向量表在内存中存放,对于8086CPU,中断向量表指定存放在内存地址0出,从内存0000:0000开始
中断过程
发生中断,收到中断类型码,通过中断向量表得到中断处理程序的入口,保存现场(主要是标志寄存器和cs以及ip寄存器)。然后调用中断处理程序。
中断处理程序和iret指令
中断处理程序必须一直存储在内存某空间,入口地址也必须存储在对于的中断向量表中。
中断处理程序的编写方法和子程序比较类似:
1 保存用到的寄存器
2 处理中断
3 恢复寄存器
4 iret指令返回
;这里的iret指令用汇编来描述就是
pop ip
pop cs
popf
外中断
在CPU中除了内部的控制,还有感受外部输入的控制。
接口芯片和端口
pc系统的接口卡和主板上装有各种借口芯片。这些外设接口芯片的内部有若干寄存器,CPU把这些寄存器当端口来访问
外设的输入不是直接进入CPU和内存,而是送入相关接口芯片的端口中,CPU向外也是先送入端口中,再由相关的芯片送到外设中,CPU还可以向外设输出控制命令。
CPU通过端口和外设联系
外中断信息
外设的输入随时可能有
于是CPU提供中断机制来满足这种需求,当CPU外部有需要处理的事情发生时,相关芯片将向CPU发出相应的中断信息。CPU在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。
在PC中外中断一共有两类:
外中断分类
1可屏蔽中断
可屏蔽中断是CPU可以不响应的外中断,CPU是否响应可屏蔽中断,要看标志寄存器IF位的设置,如果IF=1就响应,IF=0则不响应
8086中提供了设置IF的指令:
sti设置if=1
cli设置if=0
2不可屏蔽中断
不可屏蔽中断是CPU必须响应的外中断,当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程。在8086中不可屏蔽中断类型码固定位2,所以中断过程中,不需要取中断类型码了