[汇编学习笔记][第十二章内中断]

第十二章 内中断

任何一个通用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设置完后才能响应中断。

你可能感兴趣的:(汇编)