📄 chapter8.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>第八章 中断</title>
</head>
<body bgcolor="#4B5983" text="#FFFFFF">
<h1 align="center"><font face="宋体" color="#FFFFFF" size="7">第八章 中断</font></h1>
<h2 align="center"><font face="宋体" color="#FFFFFF" size="6">§8.1 概述</font></h2>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">一、中断</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFF00">中断</font><font
face="宋体" size="5" color="#FFFFFF">:是一种使CPU终止当前正在执行的程序而转去处理特殊事件的操作,并且,每一种特殊操作都对应了一个专门的类型号。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
为解决快速的CPU与慢速的外设之间的矛盾,一方面要提高外设的工作速度,另一个解决的方法就是采用中断的处理方式。</font></p>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">1、采用中断处理方式的优点</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
采用中断处理方式,可以实现如下的功能:</font></p>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFF00">同步操作</font><font
face="宋体" size="5" color="#FFFFFF">:外设将数据准备好后,发出中断请求,CPU勿需等待,提高了CPU的利用率,也提高了输入输出的速度。</font></p>
<p align="left"><font face="宋体" size="5" color="#00FF00">实时处理</font><font
face="宋体" size="5" color="#FFFFFF">:现场的各个参数、信息可以在任何时候发出中断请求,要求CPU处理。</font></p>
<p align="left"><font face="宋体" size="5" color="#00FFFF">故障处理</font><font
face="宋体" size="5" color="#FFFFFF">:计算机可以利用中断系统对故障进行自行处理。</font></p>
</blockquote>
</blockquote>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">2、中断系统应该具有的功能</font></h4>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)实现中断及返回;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)能够实现优先级排队;</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)高级中断源能够中断低级的中断处理。</font></p>
</blockquote>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">二、8086/8088的中断分类</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 8086/8088系统一共可以处理256种(级)中断,每一种中断对应一个类型码,0
~255(0~0FFH),该类型码称为中断类型码/中断类型号。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
总体上可以分为硬件中断和软件中断两类。</font></p>
<h4 align="left"><font face="宋体" size="5" color="#FFFF00">1、硬件中断</font><font
face="宋体" size="5" color="#FFFFFF">:</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> 是指由CPU外部的硬件电路产生的中断,也称为外部中断。分为如下两类:</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)可屏蔽中断:由CPU的INTR引脚进入CPU,受IF标志的控制。可以允许有多个此种类型的中断。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)不可屏蔽中断/非屏蔽中断:由CPU的NMI引脚进入CPU,不受IF标志的控制。一个系统只允许有一个此种类型的中断。</font></p>
</blockquote>
<h4 align="left"><font face="宋体" size="5" color="#FFFF00">2、软件中断</font><font
face="宋体" size="5" color="#FFFFFF">:</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF"> CPU根据软件中的指令或者执行指令之后的标志位的状态而产生的中断,该种中断不需要有外部电路,是在CPU内部产生的,也称为内部中断。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">例如:</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">MOV AH,02</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">MOV DL,‘A’</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">INT 21H</font></p>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">目前,系统中断类型号的大致分配如下:</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">1)专用中断:类型号0~4</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">类型号0---除数为0,或者商超过了范围。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">类型号1---单步中断。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">类型号2---非屏蔽中断NMI。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">类型号3---断点中断,INT
3。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">类型号4---溢出中断,INTO。</font></p>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">2)保留的中断:类型号5~31</font></p>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">提供给系统使用,用户一般不自行定义。</font></p>
</blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">3)供用户定义的中断:类型号32~255</font></p>
<p align="left"> </p>
<p align="left"><font face="宋体" size="5" color="#FFFF00">注:到Intel 386以后,称某些软件中断为“异常”。</font></p>
</blockquote>
<p align="left"> </p>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">三、中断向量和中断向量表</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFF00">1、中断向量</font><font
face="宋体" size="5" color="#FFFFFF">:中断处理子程序的入口地址。每一个中断类型都要对应一个中断向量。每一个中断向量包括段地址和偏移地址,是一个4个字节的信息。</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFF00">2、中断向量表</font><font
face="宋体" size="5" color="#FFFFFF">:位于内存0段的0~03FFH区域内能够容纳256个中断向量的存储空间。</font></p>
<p align="center"><font face="宋体" size="5" color="#FFFFFF">256*4=1024=0400H</font></p>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
一个中断向量占用4个字节存储单元,地址较低的两个字节存储中断处理子程序的入口地址的偏移地址(IP),地址较高的两个字节存储中断处理子程序的入口地址的段地址(CS)。在中断向量表中,从地址最低处[0:0000H]开始,相继地存放中断类型号为0~255的中断向量。即中断类型号为N的中断向量在中断向量表中的地址为[0:4*N]。</font></p>
</blockquote>
<p align="center"><img src="zhdxl.gif" width="468" height="471"
alt="zhdxl.gif (7347 bytes)"></p>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">四、中断指令</font></h3>
<blockquote>
<h4 align="left"><font face="宋体" color="#FFFFFF"><big><big>1、中断调用---INT</big></big></font></h4>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>格式:INT type</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>操作:(SP)←(SP)-2</big></big></font></p>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(PSW)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)-2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(CS)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)-2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(IP)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(IP)←(4*type)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(CS)←(4*type+2)</big></big></font></p>
</blockquote>
</blockquote>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>
若指令中未指定中断类型号,则默认的中断类型号为3,即断点中断。</big></big></font></p>
<h4 align="left"><font face="宋体" color="#FFFFFF"><big><big>2、若溢出则中断---INTO</big></big></font></h4>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>格式:INTO</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>操作:</big></big></font></p>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)-2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(PSW)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)-2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(CS)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)-2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>((SP))←(IP)</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(IP)←(0:10H);类型号为4</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(CS)←(0:12H)</big></big></font></p>
</blockquote>
</blockquote>
<h4 align="left"><font face="宋体" color="#FFFFFF"><big><big>3、中断返回---IRET</big></big></font></h4>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>格式:IRET</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>操作:(IP)←((SP))</big></big></font></p>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)+2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(CS)←((SP))</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)+2</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(PSW)←((SP))</big></big></font></p>
<p align="left"><font face="宋体" color="#FFFFFF"><big><big>(SP)←(SP)+2</big></big></font></p>
</blockquote>
</blockquote>
</blockquote>
<h3 align="left"><font face="宋体" size="5" color="#FFFFFF">五、中断向量的保存和恢复</font></h3>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">
在对中断的操作过程中,进入中断处理子程序(中断执行)之前,必须保存原来的中断向量,从中断处理子程序返回后(IRET),必须将保存的原中断向量恢复到中断向量表中。</font></p>
<h4 align="left"><font face="宋体" size="5" color="#FFFFFF">1、对中断向量表的直接读写</font></h4>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">例如:</font></p>
</blockquote>
<blockquote>
<blockquote>
<p align="left"><font face="宋体" size="5" color="#FFFFFF">CODE1 SEGMENT</font></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -