汇编内中断


任意一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理,这个特殊的信息,我们可以称为:中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息
中断信息可以来自CPU的内部和外部,我们主要讨论来自于CPU内部的中断信息

内中断的产生

当CPU的内部有什么事情发生的时候,将产生需要马上处理的中断信息呢?对于8086CPU,当CPU内部有下面的情况发生的时候,将产生相应的中断信息。

  • 除法错误,比如,执行div指令产生的除法溢出
  • 单步执行
  • 执行into指令
  • 执行int指令
    要进行不同的处理,CPU首先要知道,所接收到的中断信息的来源,所以中断信息中包含识别来源的编码,8086CPU用称为中断类型码的数据来标识中断信息的来源,中断类型码为一个字节型数据,可以表示256种中断信息的来源,上述的4种中断源,在8086CPU中的中断类型码如下:
  • 除法错误:0
  • 单步执行:1
  • 执行into指令:4
  • 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码

中断处理程序

CPU收到中断信息后,需要对中断信息进行处理,而如何对中断信息进行处理,可以由我们编程决定,我们编写的,用来处理中断信息的程序被称为中断信息处理程序,一般来说,需要对不同的中断信息编写不同的处理程序
CPU在收到中断信息后,应该转去执行该中断信息的处理程序,我们知道,若要8086CPU执行某处的程序,就要将CS:IP指向它的入口(即程序第一条指令的地址),可见首要的问题是,CPU在收到中断信息后,如何根据中断信息确定其处理程序的入口。
CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU根据中断信息可以找到要执行的处理程序
我们知道,中断信息中包含有标识中断源的类型码,根据CPU的设计,中断类型码的作用就是用来定位中断程序处理程序,比如CPU根据中断类型码4,就可以找到4号中断的处理程序,若要定位中断处理程序,需要知道它的段地址和偏移地址,如何知道它的地址?

中断向量表

CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址
中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口
CPU只要知道了中断类型码,就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址。
对于8086CPU机,中断向量表指定放在内存地址0处,从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表,能放在其他地方吗?不能,对于8086CPU,这是规定,因为8086CPU就从这个地方读取中断向量表
对于8086CPU,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址存放偏移地址

中断过程

用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的,CPU硬件完成这个工作的过程被称为中断过程

  • CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程,硬件在完成中断过程中,CS:IP将指向中断程序处理程序的入口,CPU开始执行中断处理程序。
    还有个问题需要考虑,CPU在执行完中断处理程序后,应该返回原来的执行点继续执行后面的指令,所以在中断过程中,在设置CS;IP之前,还要将原理的CS和IP的值保存起来,在使用call指令调用子程序时有同样的问题,子程序执行后还要返回到原来的执行点继续执行,所以,call指令先保存当前CS和IP的值,然后再设置CS和IP
    下面是8086CPU在收到中断信息后,所引发的中断过程
  • (从中断信息中)取得中断类型码
  • 标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中)
  • 设置标志寄存器的第8位TF和第9位IF的值为0(这一步之后将介绍)
  • CS的内容入栈
  • IP的内容入栈
  • 从内存地址为中断类型码4和中断类型码4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS

我们更简洁地描述中断过程,

  • 取得中断类型码N
  • pushf
  • TF=0,IF=0
  • push CS
  • push IP
  • (IP)=(Nx4),(CS)=(Nx4+2)

中断处理程序和iret指令

由于CPU随时都可能检测到中断信息,所以中断处理程序必须一直存储在内存某段空间之中,而中断处理程序的入口地址,必须存储在对应的中断向量表表项中

  • 保存用到的寄存器
  • 处理中断
  • 恢复用到的寄存器
  • 用iret指令返回

iret指令的功能用汇编语法描述为:

pop IP
pop CS
popf

iret通常和硬件自动完成的中断过程配合使用,可以看到,在中断过程中,寄存器入栈的顺序是标志寄存器,CS,IP,而iret的出栈顺序是IP,CS,标志寄存器,刚好和其相对应,实现了用执行中断处理程序前的CPU现场恢复寄存器和CS,IP的工作,iret指令执行后,CPU回到执行中断处理程序前的执行点继续执行程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值