汇编语言程序设计(十二)内中断

2022/5/29 1:19:55

本文主要是介绍汇编语言程序设计(十二)内中断,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 中断定义与分类
  • 中断处理程序
  • 中断过程
  • 8086CPU中断过程
  • 0号中断,除法错误中断处理
  • 单步中断
  • 不响应中断的情况

中断定义与分类

  • 中断是CPU处理外部突发事件的一个重要技术,使得CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回端点,继续CPU原来的工作。

  • 发出中断请求的来源叫中断源,根据中断源的不同,可将中断分为硬件中断和软件中断两大类,硬件中断又可以分为外部中断和内部中断两类(这里有待商榷,硬件中断是否是外部中断和内部中断的并集)。

  • 外部中断是由计算机外设发出的中断请求,比如键盘中断、打印机中断、定时器中断等。外部中断可以屏蔽,比如利用中断控制器来屏蔽这些外部设备的中断请求。

  • 内部中断是指因硬件出错(如突然掉电、奇偶校验错),或运算出错(除数为零、运算溢出、单步中断等)所引起的中断,内部中断是不能屏蔽的

  • 软件中断不是真正的中断,他们是一些可调用程序以及DOS的系统功能调用等。

  • CPU规定了中断的优先权,中段优先权从高到低的顺序是:(1)除法错、溢出中断、软件中断(2)不可屏蔽中断(3)可屏蔽中断(4)单步中断

中断处理程序

  • CPU设计者必须在中断信息和其处理程序的入口地址之间建立联系,使得CPU可以根据中断信息找到要执行的处理程序。

  • 中断信息中包含表示中断源的类型码,中断类型码的作用就是用来定位中断处理程序。比如中断类型码为4,那么CPU如果根据这个类型码来找到4号中断的处理程序呢?

  • 要定位中断处理程序,需要知道该程序在内存中的段地址和偏移地址,但是一个8位的中断类型码肯定是无法同时包含段地址和偏移地址的,因此,需要引入中断向量表。

  • 中断向量表中每个元素都是一个中断处理程序的入口地址,而中断类型码本质上就是中断向量表的索引,用该索引来定位中断处理程序。

  • 因此,中断向量表必须常驻内存。如下图所示,之所以有256个中断源是因为段地址和偏移地址都是16位的,因此一定可以索引16*16=256个中断源。

  • 对于8086CPU来说,中断向量表指定放在内存地址0处,从内部0000:0000到0000:03FF的1024个字节中存放着中断向量表,为什么是1024个字节呢,因为前边说了中断向量表一共包含256个段地址:偏移地址,段地址和偏移地址各占两个字节,因此一共4个字节,4*256=1024。

  • 但是需要注意的是0:200到0:300这块内存是没有用上的,即这一段并没有存放中断处理程序的地址,所以这块内存比较安全,可以胡搞一下试试。

  • 由于CPU随时都可能检测到中断信息,即cpu随时都可能执行中断处理程序,所以中断处理程序必须一致存储再内存某段空间中。

  • 中断处理程序的入口地址即中断向量,必须存储在对应的中断向量表中。

  • 中断处理程序的常规步骤如下:

  • 中断过程中,寄存器入栈顺序是标志寄存器、CS、IP,iret指令出栈顺序是IP、CS、标志寄存器。

  • iret指令执行后,CPU回到执行中断处理程序的执行点继续执行原程序。

中断过程

  • 利用中断类型码,在中断向量表中找到中断处理程序的入口
  • 用该入口地址来设置CS和IP,使CPU执行中断处理程序
  • 上述用中断类型码找到中断向量,并用它设置CS和IP,这个工作由CPU硬件自动完成,CPU硬件完成这个工作的过程称为中断过程。

8086CPU中断过程

  • 从中断信息中取得中断类型码
  • 标志寄存器的值入栈,保护标志位,因为中断处理程序可能改变标志位
  • 设置标志寄存器的第8位TF和第9位IF的值为0
  • CS的内容入栈
  • IP的内容入栈
  • 从中断向量表起始地址处,找中断类型码4和中断类型码4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。

0号中断,除法错误中断处理

单步中断

  • 即CPU在执行了一条指令后就转去做其它事情的功能,CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。单步中断的中断类型码为1,其中断过程如下:
  • 即当TF=1时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序,执行完中断处理程序后,又返回原来的位置继续执行。
  • CPU提供单步中断,就是为了单步调试,,,

不响应中断的情况

  • 一般情况下cpu执行过程中检测到中断都要去执行中断处理执行,但也有很多情况是不响应中断的。例如,刚执行完向ss寄存器传送数据的指令后,即使检测到中断信号,CPU也不会响应。

  • 因为ss:sp联合使用是指向栈顶的,因此设置ss和sp的指令应该连续完成。否则会出现错误。

  • 比如,执行完设置ss的指令后,CPU响应了中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。此时ss已经被设置了,但是sp并未设置,ss:sp指向的不是正确的栈顶,如果在中断处理程序中用到了栈中内容,则此时会引发错误。

  • 因此,设置ss和sp的指令要连续放,在此之间不会响应中断过程。比如下边的例子,如果设置ss和设置sp的指令之间有其它执行,中间的指令即使出现了错误cpu也不会响应中断。因此一定要将设置ss和sp的指令连续放。



这篇关于汇编语言程序设计(十二)内中断的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程