[汇编学习笔记][第十二章内中断]
第十二章 内中断
任何一个通用CPU,在执行完当前执行的指令,检测到从CPU外部发送过来,或内部发送过来的一种特殊信息,并且可以立即对所接收到的消息进行处理。这个消息,我们称为中断消息。
中断消息可以来自CPU的内部和外部,这一章中,我们主要讨论来自于CPU**内部**的中断消息
12.1 内中断的产生
8086CPU中发生以下事件,会产生相应的中断消息。
- 除法错误
- 中断类型码:0
- 单步执行
- 中断类型码:1
- 执行into指令
- 中断类型码:4
- 执行int指令
- 中断类型码:该指令格式为int n,指令中n为字节型立即数,提供给CPU的中断类型码。
8086CPU用称为中断类型码的数据来标示来源
- 中断类型码是一个字节,可以表示256种中断信息的来源。
- 将产生中断事件的来源,称位中断源
12.2 中断处理程序
CPU收到中断信息后,需要对中断信息进行处理。而如何处理,可由我们编程确定。这样的程序称为,中断处理程序。
如果将8位中断类型码得到相应的中断处理程序的CS:IP呢?
这就是下一章的学习内容
12.3 中断向量表
- 中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口。
- 中断向量表的入口对于8086CPU就在0000:0000~0000:03FF的1024个单元中存放.
- 一个中段向量表的单元占4个字节,高地址放段地址, 低地址放偏移地址
12.4 中断过程
- 用中断类型码,在中断向量表中找到中断处理程序的入口
- 根据入口,使CPU执行中断处理程序
这个过程由CPU的硬件自动完成, CPU硬件完成这个过程叫中断过程
具体是这样的
- 取得中断码
- 标志寄存器入栈(因为中断过程要改变寄存器的值)
- 设置标志寄存器的第8位TF和第9位IF的值为0
- CS的内容入栈
- IP的内容入栈
- 读取中断处理程序
代码是这样的
- 取得中断类型码N;
- pushf
- TF=0,IF=0
- push CS
- push IP
- (IP)=(N*4),(CS)=(N*4+2)
12.5 中断处理程序和iret指令
中断程序的过程
- 保存用到的寄存器 (注意不是寄存标志器)
- 处理中断
- 恢复用到的寄存器
- 用
iret
指令返回
iret
指令详细
- pop IP
- pop CS
- popf
12.11 单步中断
如果检测到标志寄存器TF
位为1,则产生单步中断
- 所以为了防止在进行中断处理程序的时候,因为
TF=1
,又去执行中断处理程序,所以在进入中断程序前要使TF=0
。
12.12 响应中断的特殊情况
在某些情况,CPU执行完当前命令后,即便是发生中断,CPU也不会响应。
举例:
在执行完向
ss
寄存器传送数据的指令后,即便是发生中断,CPU也不会响应,ss:sp
联合指向栈顶,如果单纯的修改了ss
,触发中断,但是中断的时候也需要利用到栈,那么因为只修改了ss
,很有可能指向的不是正确的栈顶。所以要ss:sp
设置完后才能响应中断。