汇编语言程序设计(十二)内中断
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的指令连续放。
这篇关于汇编语言程序设计(十二)内中断的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南