汇编语言程序设计》第十三章:中断及中断处理程序.ppt_第1页
汇编语言程序设计》第十三章:中断及中断处理程序.ppt_第2页
汇编语言程序设计》第十三章:中断及中断处理程序.ppt_第3页
汇编语言程序设计》第十三章:中断及中断处理程序.ppt_第4页
汇编语言程序设计》第十三章:中断及中断处理程序.ppt_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

- 朱耀庭 汇编语言程序设计汇编语言程序设计 -朱耀庭朱耀庭 第13章 中断及中断处理程序 v 中断在计算机科学中占有十分重要的地位,是计算机科学 中最基本的概念之一。如果没有中断以及中断机制的引入 与应用,就不可能有计算机操作系统的出现,也就不可能 有今天如此高效率的计算机。使用计算机时,操作健盘、 移动鼠标之所以能够被计算机感知并且予以及时响应处理 ,这完全得益于计算机的中断处理。 v 本章将重点介绍80X86 的中断机制及中断处理程序的设计 方法,同时还将介绍请求DOS、BIOS中断服务,以及调 用DOS、BIOS内部功能子程序(即DOS、BIOS功能调用 )的方法和用途等。 第二章 80x86实模式汇编的运行环境 13.6 典型的中断处理程序实例 13.5 DOS和BIOS功能调用实例 13.4 BIOS中断服务 13.2 软件中断 13.1 中断及中断相关概念 13.3 DOS中断服务 13.1 中断及中断相关概念 13.1.1 中断的基本概念 13.1.2 中断向量表 13.1.3 中断源及中断源的识别 13.1.4 中断的分类 13.1.5 中断处理机制 13.1.6 CPU响应中断的条件 13.1.7 中断的优先级 13.1.1 中断的基本概念 v 在计算机系统中,引入中断的最初目的是为了提高系统的 输入输出性能 v 随着计算机应用的发展,中断技术也应用到计算机系统的 许多领域,如:多道程序、分时系统、实时处理、程序监 视和跟踪等领域。 v 中断就是使中央处理器暂时挂起当前正在进行的工作程序 ,转向某紧急事件的服务与处理程序,并在执行完该服务 与处理程序后,再返回到曾经被其中止和挂起的原有程序 处继续完成原有工作的整个过程。 13.1.2 中断向量表 v 在中断发生后,中断处理程序需要对因各种原因触发的相应中断进行 处理。 v 80X86中断系统能处理256种类型的中断,同时给每种中断安排了一 个中断类型号,即0H0FFH号中断,每种类型的中断都有相应的中断 处理程序。 v 如何有效地管理和保存如此多的中断及其对应的中断处理程序呢?那 就是利用中断向量表。 v 中断向量表是一个特殊的线性表,它保存着系统所有中断服务程序的 入口地址。 v 在80X86微机系统中,该表保存的256个中断向量分别对应于256种中 断类型,每个表项占4个字节,其中两个字节存放中断处理程序的段 地址,另两个字节存放中断处理程序的段内偏移量,所以中断向量表 为1K字节,它起止于存储器中地址0000H3FFH处,如图13-1所示: 13.1.2 中断向量表 图13-1 中断向量表 13.1.2 中断向量表 v 各个中断处理程序的入口地址在中断向量表中是按中断类 型号顺序存放的,因此将中断类型号乘以4就得到对应中 断向量的地址。 v 例如,溢出中断的中断类型号为04H,则它的中断向量的 地址为04H4=10H,内存地址从10H开始的4个字节中, 10H和11H两字节中存放溢出中断程序的偏移地址,12H 和13H两字节中存放溢出中断程序的段地址,在发生溢出 中断时,将这个偏移地址和段地址分别取出送给寄存器IP 和CS,CPU即转向溢出中断处理程序。 13.1.2 中断向量表 表13-1 中断类型号和中断向量地址 中断类型号中断向量地址中断的含义 00H1FH00000H0007FHBIOS中断向量 20H3FH00080H000FFHDOS中断向量 40H5FH00100H0017FH扩充BIOS中断向量 60H67H00180H0019FH用户中断向量 68H6FH001A0H001BFH保留 70H77H001C0H001DFHI/O设备中断向量 78H7FH001E0H001FFH保留 80H0FDH00200H003C3HBASIC 0F1H0FFH003C4H003FFH保留 13.1.2 中断向量表 v 图13-2以DOS中断INT 20H为例,说明CPU处理各类中断 的过程,该过程主要包括以下5个步骤: (1)取中断的中断类型号 (2)计算中断向量地址 (3)取出中断向量4字节单元中的内容,将其中两字节代 表中断处理程序段地址的内容送入CS寄存器,两字节代表 中断处理程序偏移量的内容送入IP寄存器 (4)转向相应的中断处理程序 (5)中断返回到原中断指令的下一条指令处 13.1.2 中断向量表 图13-2 中断处理过程 演示动画 注意: 这里假设被中断的程序的下一条指令是“MOV AX,0”,事实 上也可能是其他指令 13.1.3 中断源及中断源的识别 v 在中断过程中,我们称引起紧急事务的事件为中断源 v 计算机系统有上百种可以发出中断请求的中断源,但最常 见的中断源是:外设的输入/输出请求 v 例如,键盘输入引起的中断,通信端口接收信息引起的中 断等 v 还有一些计算机内部的异常事件,例如,0作除数、奇偶 校验错等 v 80X86的常见中断源如图13-3所示: 13.1.3 中断源及中断源的识别 图13-3 80X86中断源 演示动画 13.1.3 中断源及中断源的识别 v 常见的中断源大致分为CPU外部产生的中断和CPU内部产 生的中断。其中外部中断源包括通过NMI引脚传递的非屏 蔽中断请求产生的中断和通过Intel 8259A可编程中断控制 器的INTR引脚传递的由外部设备产生的中断等。CPU内 部中断则包括除法出错中断、单步中断、INTO指令产生的 溢出中断和程序中安排的INT n中断指令产生的中断等。 v 外部设备的中断通过8259A的INTR引脚给CPU传送中断 信号,8259A还可以使用级联的方式增加连接的外部设备 数目。如此多的中断源,CPU是如何确定INTR引脚上的 中断信号是来自中断源中的哪一个呢?CPU是通过一定的 查询电路来完成的。 13.1.3 中断源及中断源的识别 查询中断识别法 1 向量中断识别法 2 1. 查询中断识别法 v 查询中断识别法主要是软件查询法,在接受中断请求信号 之后,中断识别程序逐个查询连接到系统上的每个设备。 当被检查设备的中断请求触发器被置位时,中断识别程序 便转向相应的中断服务程序的入口地址处。 v 对于中断源较多的大系统来说,查询中断花费在查询上的 时间就太多了,并且还需要有附加的中断识别程序,因此 多数系统采用另一种更加方便、快速的中断识别方法 向量中断识别法。 2. 向量中断识别法 v 向量中断识别法要求输入/输出设备提供中断信号和设备的 标识码,即中断向量,或者提供中断服务程序的入口地址 。当CPU响应了某设备的中断请求后,控制逻辑就将该设 备的中断服务程序的地址传送至CPU,使CPU跳转到相应 的中断服务程序,进而完成中断服务。 v 向量中断识别虽然识别中断源十分快捷,但它需要增加硬 件的开销,因此将查询中断识别法和向量中断识别法结合 起来使用效果会更好。目前有许多计算机系统就是这样做 的。 13.1.4 中断的分类 v 计算机系统有上百种中断,如何对这些中断的类型进行划 分呢? v 由图13-3中80X86系统的常见中断源可知,可以将中断按 中断源划分为内部中断和外部中断。 v 按中断源的特性,中断也可以分为硬件中断和软件中断。 v 硬件中断按中断的屏蔽性质,又可以分为可屏蔽中断和不 可屏蔽中断。 v 下面详细介绍一下这几种划分以及它们之间的相互关系。 13.1.4 中断的分类 外部中断 1 内部中断 2 1. 外部中断 v 外部中断一般是指外部硬件中断,它是处理器外部的硬件 设备产生而发向处理器的中断。它分为可屏蔽中断和不可 屏蔽中断两种,分别由INTR引脚和NMI引脚的信号触发。 (1)不可屏蔽中断 v 不可屏蔽中断是用来处理一些紧急情况,如电源故障、内 存或I/O总线的奇偶错误等异常事件。它不能由用户通过指 令进行屏蔽,也不受中断允许标志IF的限制。一旦CPU接 收到NMI引脚上的信号,就必须立即响应,转向NMI的中 断服务程序,硬件将自动完成断点保护和现场保护,并在 中断返回时执行一条RETN指令。 1. 外部中断 (2)可屏蔽中断 v 可屏蔽中断通常来自外部设备,可以通过指令设置中断控制器的屏蔽 参数来禁止某些指定的中断。例如中断控制器8259A有IR0IR7共8级 中断,8259A接收来自外设的中断请求信号,并将中断源的中断类型 号发送到CPU。在外设发出中断请求到CPU响应中断的过程中有两个 控制条件:一是该外设的中断请求是否被屏蔽,该条件由8259A的中 断屏蔽寄存器(IMR)控制;另一个是CPU是否允许响应中断,该条件 由CPU的标志寄存器(FLAGS)中的中断允许位IF来控制。 v 可以通过置中断屏蔽寄存器来屏蔽相应的中断申请。8259A的中断屏 蔽寄存器I/O端口地址是21H,该寄存器的8位对应控制8个外部设备。 若某位为0,表示允许该位对应外设的中断请求;若某位为1,则表示 该位对应外设的中断请求被屏蔽。 1. 外部中断 v 例如,如图13-3所示,假设只允许系统定时器中断,系统定时器的中 断请求对应8259A的IRQ0,于是可如下设置中断屏蔽寄存器: MOV AL,11111110B OUT21H, AL v CPU是否响应外设发出的中断请求还与标志寄存器中的中断标志位IF 有关。IF为0,CPU禁止响应任何外设请求的中断;IF为1,则CPU可 以响应外设的中断请求。在程序中可以通过以下两条指令来设置和清 除IF位。 STI;开中断,IF=1 CLI;关中断,IF=0 v 在任何类型的中断发生时,CPU将当前的FLAGS入栈,并置IF为0, 然后进入中断处理程序。当中断处理程序完成,执行到中断返回指令 IRET时,从栈中恢复原FLAGS的值,将IF置1,这时允许新的中断发 生。如果需要在一个中断处理程序的执行过程中允许响应另外的中断 ,也可以使用开中断指令STI。 2. 内部中断 v 内部中断主要包括内部硬件中断和软件中断 v 内部硬件中断是指由某些特殊指令触发的中断 如单步中断 除法出错中断 溢出中断 v 软件中断则是指由指令INT n引起的非屏蔽中断 如DOS中断、BIOS中断和其他自由中断 2. 内部中断 (1)除法出错中断 v 除法错的中断类型号为0。除法运算中除数不能为0,因此在程序中不 慎写入了除数为零的除法运算,就会产生除数为零的中断。还有一种 情况,那就是在除法运算中,所得的商大于某一确定的极值也将引起 除法出错中断。例如: MOV DX,34H MOV AX,5678H MOV BX,1 DIV BX v 上面的4条指令,是一个双字除以字的运算。结果将商放在AX寄存器 中,余数放在DX寄存器中。对于无符号数商的最大允许值为65535, 而这里除数BX为1,所以商345678H必然大于65535,因此也将产生 一个除法错误。 2. 内部中断 (2)溢出中断 v 溢出中断的中断类型号为4。在指令序列中,若上一个指令由于某些 特殊的原因使溢出标志OF置1,那么当执行溢出中断指令INTO时会立 即产生04H类中断,若OF标志为0,则INTO不起作用。 (3)单步中断和断点中断 v 在使用DEBUG调试程序时,会经常使用到T命令和P命令,而这两个 命令的执行恰好是利用了内部硬件中断之一的单步中断INT 01H和断 点中断INT 03H,它的特征是将陷阱标志TF置位,这样当程序运行时 ,会在每一条指令的后面产生一个单步中断,从而终止指令的继续执 行。 2. 内部中断 (4)软件中断 v CPU在执行完一条INT n指令后,就会立即产生n类软件中断,调用系 统中相应的中断处理程序完成中断的功能。其中INT n指令的n为中断 类型号。 v 例如,对系统定时器进行控制,则可以在程序中安排一条中断指令: INT1CH v 当CPU执行到这条指令时,则从中断向量表中1CH4=70H至73H处 取4个字节的内容(它们是中断服务程序的偏移量和段地址),自动 将其送到IP和CS,然后转向对应的中断服务程序。 v INT指令可以指定0H0FFH中的任何中断类型号。除系统占用的中断 类型号外,用户可以利用保留的中断类型号扩充新的中断处理功能。 13.1.5 中断处理机制 v 计算机系统中的中断源大致可分为几类,如一般的I/O设备、软件中断 、实时钟、故障源等。一个中断系统如果要合理地响应如此多的中断 源,就需要具备以下十分完善的“中断处理机制”。 (1)当中断源向CPU发出中断请求时,CPU能有权决定是否响应此中断 请求,在响应中断请求的情况下要能保护断点,中断处理程序执行完 毕后能够正确返回断点处继续执行。 (2)中断应具有优先级。在某一时刻如果有许多中断源同时发出中断请 求,CPU应能够实现中断优先级排队,即按中断请求的级别来决定先 响应哪一个中断,保证首先响应优先级高的中断请求,但同时又要防 止低级中断源的中断请求一直得不到CPU响应的现象出现。 13.1.5 中断处理机制 (3)能够实现中断的嵌套。中断源向CPU发出的中断请求是连续不断的 ,即使已经是响应了某个中断请求而进入相应的中断服务程序,如果 这时又有了一个级别更高的中断请求,CPU应该能暂时挂起正在进行 的中断服务程序,转而去响应更高优先级的中断请求,响应结束后再 返回到原中断处理程序。例如当自己编写的中断服务程序中用到DOS 或BIOS提供的中断时,它们就相当于更高级别的中断请求,当CPU 响应并进入自己编写的中断服务程序时,如果遇到DOS或BIOS中断 ,就需暂时挂起自己的中断服务程序转而去响应DOS或BIOS中断。 13.1.6 CPU响应中断的条件 v CPU一般是在执行现行指令的最后一个机器指令周期时检 测是否有中断请求的,所以在硬件上需要每个中断源都接 有一个中断请求触发器,以便能够将中断源产生的中断请 求信号锁存起来,并保持到CPU检测完之后。 v 同时,为了在多个中断源请求中断的情况下能够增加控制 的灵活性,在硬件上还需要一个中断屏蔽触发器,以决定 中断请求被通过还是被屏蔽。 v 此外,在CPU内部还要有一个中断允许触发器,它可以通 过STI和CLI指令来设置。即通过STI开中断,使CPU能正 常响应中断源的中断请求;而通过CLI关中断,使CPU不 响应任何中断请求。 13.1.6 CPU响应中断的条件 v 因此,CPU响应某个中断请求须满足以下3个条件: (1)中断源置中断请求触发器。由于CPU在每条指令周期结束时才检测 是否有中断请求信号,所以中断请求触发器包含一个锁存器,它将中 断请求信号锁存起来直到CPU来检测之后再清除。 (2)中断源的中断屏蔽触发器未被置位,否则该中断源的所有中断请求 将被屏蔽掉。若干中断源的屏蔽触发器可以组成一个中断屏蔽寄存器 。 (3) CPU内的中断允许触发器置位。当CPU响应中断之后,CPU自动 将中断允许触发器复位,即关中断。因此,在中断服务程序中,保护 现场后一般情况下应该使用STI指令开中断,使CPU能够继续响应来 自其他中断源的更高级别的中断请求,来实现所谓的中断嵌套。 v 当上述3个条件都满足时,如果此时CPU正好处在指令周期的结束并 检测到有中断请求时,那么就响应中断并进入中断响应周期。 13.1.7 中断的优先级 v 多数中断是随机发生的,所以必然会出现某一时刻有多个 中断源同时请求中断的情况。 v CPU在某一时刻只能处理一个中断,因此,它需要决定首 先为哪一个中断源服务。 v CPU根据中断源请求的轻重缓急,预先定义好中断处理的 优先级,首先响应紧急的、级别高的中断请求,然后响应 级别轻缓的中断请求。 v 当CPU正在处理某一中断时,它还应该能够响应优先级更 高的中断请求,而屏蔽掉同级或较低级的中断请求。 13.1.7 中断的优先级 软件查询法 1 硬件查询法 2 1. 软件查询法 v 软件查询优先级的方法十分简单,它将所有外设的中断请 求触发器组合成一个寄存器端口。 v 当CPU接收到中断请求信号时,由一个查询程序来逐位检 测中断请求寄存器的状态。先被检测的位,它所对应的中 断源是高优先级的;后检测的位,它所对应的中断源是低 优先级的。 v 由于软件查询法是通过程序实现查询的,所以当中断源较 多时软件查询的时间就会较长。 2. 硬件查询法 v 硬件查询是一种广泛使用的中断优先级排队方式,它通过使用优先权 控制器(PIC)莱实现优先级排队。优先权中断控制器是由优先权编码器 和比较器等构成的电路,再加上中断请求寄存器、中断屏蔽寄存器共 同组成了一个比较完整的中断控制系统。 v 优先权控制器PIC可同时接收8个中断输入。与每一个中断请求位对应 的有一个中断屏蔽位,程序设计者可以对中断屏蔽寄存器编程以选择 允许的中断。这样可以灵活地调整中断优先级,并可防止出现低级中 断永远也得不到响应的情况出现。没有被屏蔽掉的请求信号被送往优 先级编码器,其中具有高优先级的中断级由一个8-3编码器转换成3位 码,用这个3位码与3位的优先级寄存器进行比较,这个3位的优先级 寄存器是由用户自己设定的。用户设定了某一值后,只有优先级高于 这个值的中断才能产生中断请求,而等于或低于这个值的所有中断将 被屏蔽掉。此外优先级寄存器内还有一位可由用户设置的禁止位,设 置禁止位后可使中断优先级比较失效,使中断检测信号不经过比较而 直接送到CPU的中断请求线上。 13.1.8 中断嵌套 v 中断嵌套是指当CPU正在执行某一低级别的中断服务程序时,允许响 应更高级别的中断源的中断请求,于是暂时挂起正在处理中的中断, 转而进入更高级别的中断服务,待高优先级中断服务结束后,再返回 到刚才被中断的那一级,继续执行。 v 由于多重嵌套中断的某些特点,决定了它与单级中断在处理过程中有 以下不同之处。 (1)在响应更高级中断之前要先屏蔽掉本级和较低级的中断请求,防止 干扰; (2)在进行本级中断服务前保护现场后要先开中断,以允许更高级的中 断响应,实现中断嵌套; (3)中断服务程序结束后,为了在恢复现场时不受任何中断请求的干扰 ,必须先关中断;而在中断返回前恢复现场后再执行开中断指令,以 允许CPU响应新的中断请求。 13.2 软件中断 v 通过中断向量表管理众多的中断,用户就可以十分方便地 为自己建立一个软件中断。 v 当用户想要编制和使用自己的中断服务程序时,先应该确 定中断类型;根据中断类型确定该中断在中断向量表中的 位置;然后将自己编制的中断服务程序(可以是驻留内存的 ,也可以是非驻留内存的)所在段的段地址和位移填入中断 向量表中对应位置的两个字中。 v 对于软件中断,用户可通过指令INT n中的类型n进行安排 。 13.2 软件中断 软件中断的处理过程 软件中断的分类 13.2.1 13.2.2 13.2.3软件中断的访问 13.2.1 软件中断的处理过程 v 还是以DOS系统功能调用中断INT 20H为例,来说明由软件引起的非 屏蔽型中断,当中断指令向CPU发出中断请求时,CPU的处理过程如 下。 v 在程序中遇到INT 20H时,该指令产生中断类型号为20H的中断,该 中断在中断向量表中的地址为20H4=80H,如图13-2所示。如果在 DEBUG提示符“-”后输入命令D 0000:0080 L4,就会得到如下结果: 0000:0080 72 10 A7 00 r v D是显示内存单元命令;0000:0080是要显示的内存单元的起始地址 ,冒号前4位16进制数是待显示内存单元的段地址,冒号后4位16进制 数是待显示内存单元的偏移量;L定义显示的长度,单位为字节,4表 示显示长度值。 v 结果中的“72 10 A7 00”就代表以0000:0080开始的4字节内存单元的 16进制内容,结果最右边的“r”是相应字节的ASCII表示,对不可见 的字符以“.”代替。 13.2.1 软件中断的处理过程 v 根据显示的结果看出INT 20H所对应的中断服务程序的入口地址为 00A7:1072(注意内存中数据的存放格式是由高到低的)。 v 在接收INT 20H指令后,CPU将自动进行如下的操作。 (1)将标志寄存器(FLAGS)压入堆栈。 (2)用清中断标志(IF)和陷阱标志(TF)禁止硬件中断,即关中断。当用 户编制自己的中断服务程序时,必要时在程序内可以用STI指令开中 断,即打开由硬件自动关闭的中断允许触发器,使之能够响应更高级 的中断。 (3)将当前代码段寄存器(CS)的内容压栈。 (4)将当前指令指针(IP)压栈,步骤(3)、(4)的目的是确保中断处 理完毕之后能够正确地返回中断调用处。 (5)转向内存地址00A7:1072处进入中断服务程序。 13.2.1 软件中断的处理过程 v 在中断服务程序执行完后,即CPU接收到IRET指令时,又 将产生如下的操作。 (1)从堆栈中将保存的原指令指针IP的内容弹出到IP中。 (2)从堆栈中将保存的原段寄存器CS的内容弹出到CS中。 (3)从堆栈中保存的原标志寄存器的状态,再弹出到 FLAGS,恢复中断时的标志寄存器状态。 v 由中断处理过程可以看出,软件中断指令非常类似于子程 序调用的CALL指令,即:暂停当前程序的执行,转而执 行另一程序段,当该程序段执行完时,CPU都自动恢复原 程序的执行。 13.2.1 软件中断的处理过程 v 但两者之间还是有明显区别的。它们的主要差异有以下几点。 (1)子程序调用是程序员在编写源程序时事先安排好的,而中断是由中 断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除 外)。 (2)子程序调用是用CALL指令来实现的,但没有调用中断的指令,只 有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为 调用中断服务程序)。 (3)子程序的返回指令是RET,而中断服务程序全部是段间的调用,所 以在结束时的返回指令是IRET/IRETD。且软件中断的IRET指令具有 自动恢复断点和标志的功能。 (4)在通常情况下,子程序是由应用系统的开发者来编写的,而中断服 务程序是由系统软件设计者来编写的。 13.2.2 软件中断的分类 DOS中断 1 BIOS中断 2 自由中断 3 1. DOS中断 v DOS中断占用的中断类型号为 20H3FH,目前使用了其中的 20H27H和2FH,其余的为保 留中断。其中每种DOS中断类 型号与其对应的功能见表13-2 。 中断类型号中断向量地址功能 20H00080H00083H程序终止 21H00084H00087HDOS系统功能调用 22H00088H0008BH程序终止DOS返回 地址 23H0008CH0008FHCtrl_C中断向量 24H00090H00093H严重错误向量 25H00094H00097H绝对磁盘读 26H00098H0009BH绝对磁盘写 27H0009CH0009FH结束并驻留内存 28H000A0H000A3H键盘忙循环 29H000A4H000A7H快速写字符 2AH000A8H000AB H Microsoft网络接口 2EH000B8H000BBH基本SHELL程序装 入 2FH000BCH000BF H 多路转接接口 30H3FH000C0H000FCH保留给DOS 2. BIOS中断 v BIOS中断占用的中断号为 10H1FH。它主要是供I/O驱动 程序使用,提供了应用程序、 DOS与设备的接口功能。用户 可以忽略对具体设备硬件上的 了解,直接应用这些功能调用 完成对具体设备的控制,其中 常见的BIOS中断类型号与其对 应的功能见表13-3。 中断类型号中断向量地址功能 10H00040H00043H显示器I/O 11H00044H00047H取设备信息 12H00048H0004BH取内存容量 13H0004CH0004FH磁盘I/O 14H00050H00053HRS-232串行口I/O 15H00054H00057H磁带I/O 16H00058H0005BH键盘I/O 17H0005CH0005FH打印机I/O 18H00060H00063HROM BASIC入 口代码 19H00064H00067H引导装入程序 1AH00068H0006BH时钟 1BH0006CH0006FH键盘终止地址 (Ctrl_Break ) 1CH00070H00073H定时器 1DH00074H00077H显示器参数 1EH00078H0007BH软盘参数表 1FH0007CH0007FH图形字符扩展码 3. 自由中断 v 自由中断是由系统或应用程序设置开发的。可以理解为这类中断是系 统或应用程序为了完成特定的功能而扩展出来的中断,它们占用了中 断向量表中80H0FFH的位置。系统给自身和应用程序留下了很大的 余地。 v 这几类软件中断之间存在一定的层次关系。在用户程序中,若直接通 过端口来操作硬件或外设,处理速度是最快的,但这样做,使用户程 序存在很大的局限性。硬件环境的改变将直接影响程序的正常运行。 v 若用户程序通过调用DOS功能来实现其所需功能,那么,应用程序与 低层硬件相距较远,操作最终的对象需要经过中间环节,处理速度肯 定受到一定的损失,但这种应用程序适应性强、应用范围广、对硬件 的依赖性最小。 3. 自由中断 v 由于BIOS介于DOS和具体硬件之间,所以,调用BIOS的功能是一个 很好的折中方案。用户可在以下3种情况下考虑使用BIOS的功能: (1)BIOS提供的功能,而DOS没有提供该功能。 (2)不能利用DOS功能调用的情况(可能因为某些具体应用的限制)。 (3)基于处理速度的考虑,需要绕过DOS层的情况。 v 可以看出使用中断的层次越高,它与硬件设备相关程度就越低,处理 速度也就越低,但用户程序的适用范围较广;使用中断的层次越低, 它与硬件设备相关程度越高,处理速度越快,用户程序的适用范围较 小。因此程序员可根据应用程序的要求、对硬件环境的熟悉程度等因 素来选用不同层次的中断。 13.2.3 软件中断的访问 v 软件中断的访问在不同的环境中有不同的形式,这里仅介绍一下汇编 语言对软件中断的访问。用汇编语言申请一个标准DOS或BIOS中断 是非常简单的,用户程序通过规定的寄存器与中断服务程序之间进行 内定的规范信息交换。DOS中断和BIOS中断都是在中断调用前将功 能号装入AH寄存器,将子功能号装入AL寄存器,此时对于大部分的 中断处理程序都有一个入口和出口,在CPU的相应寄存器中装入入口 参数,在中断请求完毕之后就可通过特定的CPU寄存器获得出口参数 返回值。这里需要注意的是,进行中断调用时,在INT指令中指明的 是中断类型号,而在AH或AL寄存器中装入的是功能号,其余寄存器 在调用中断处理程序前用来保存入口参数,AH或AL寄存器与其余寄 存器在中断处理完毕后可能保存的是出口参数值。这里可以将DOS中 断和BIOS中断每类不同中断类型号中的各种功能号的调用称为DOS 功能调用和BIOS功能调用。 13.2.3 软件中断的访问 v 它们一般包含以下步骤,步骤的过程如图13-4所示: (1)将调用参数装入指定寄存器; (2)如需功能号,将它装入AH寄存器; (3)如需子功能号,将它装入AL寄存器; (4)按中断类型号使用INT指令调用DOS或BIOS中断; (5)检查返回参数是否正确。 13.2.3 软件中断的访问 图13-4 n号中断功能调用步骤 演示动画 13.2.3 软件中断的访问 v 例如,DOS系统功能调用的21H号中断,其01H号功能调 用是用来从键盘读一个字符到AL寄存器,并在屏幕上显示 。 v 该功能调用没有其他入口参数,只需往AH寄存器中装入 01H,然后使用INT 21H指令,则调用完毕后,出口参数 AL寄存器中就存放了从键盘读入字符的ASCII码。可以根 据需要对AL中的值作进一步的处理。 v 再如,21H号中断的02H号功能是在显示器上显示输出一 个字符,其入口参数为在DL寄存器中存放待显示字符的 ASCII码;又如,21H号中断的4CH号功能调用是用来结 束程序等。 13.2.3 软件中断的访问 v 例13-1 DOS系统功能调用示例 v 题目:输入一个字符,原样输出该字符 v 设计思路:INT 21H的1号、2号功能调用,分别完成输入输出 v 源程序(Ex13-1.asm)如下: CODE SEGMENT ASSUME CS:CODE START:MOV AH,01H INT 21H ;此时AL寄存器中为键盘读入字符的ASCII码 MOV DL,AL ;将AL的值送02H号功能的入口参数寄存器DL MOV AH,02H INT 21H MOV AH,4CH INT 21H CODE ENDS END START v 程序说明:DOS功能调用及其参数设置详见参考资料26。 DOS中断和BIOS中断是软件中断中两类比较重要的中断,本章下面的内容将重点介绍 这两类中断。 13.3 DOS中断服务务 DOS中断服务务的概念 常用的DOS中断 13.3.1 13.3.2 13.3.1 DOS中断服务务的概念 v 中断类型号20H27H为DOS所使用的中断,28H3FH为 DOS所保留。 v 用户可以通过INT 20HINT 27H进入DOS中断服务程序, 称其为对DOS中断服务程序的调用。 v 同样通过对入口参数的选择而调用INT 20HINT 27H服务 程序的内部子程序时,称这一调用为DOS内部功能调用, 简称DOS功能调用。 13.3.2 常用的DOS中断 v 例13-2 DOS 25H号中断,按逻辑扇区读盘 v 题目:从驱动器A中的磁盘中逻辑0扇区开始读入一个扇区 的信息,然后按十六进制的形式显示该扇区的前8个字节 。 v 设计思路:用DOS 25H号中断读盘 例13-2 DOS 25H号中断,按逻辑扇区读盘 v 程序说明: 运行结果为:EBH 3CH 90H 44H 4FH 53H 56H 4DH 在Debug环境下读者也可以直接应用Debug命令“L 0 0 0 1”和命 令“d 0”,看到A盘的前8个字节为EBH 3CH 90H 44H 4FH 53H 56H 4DH,以验证本程序执行的正确性。 13.4 BIOS中断服务务 BIOS的概念 BIOS中断服务务的概念 13.4.1 13.4.2 13.4.3常见的BIOS中断 13.4.1 BIOS的概念 v BIOS即Basic Input/Output System,指的是基本输输入/ 输输出系统统。它是一组组底层层的基础软础软 件程序。当执执行设备设备 驱动驱动 模块块或进进行字符级级I/O操作时时,它为为用户户提供了一个 相对简单对简单 的编编程接口,使用户户能在不涉及设备设备 地址及工 作特性的情况下编编程,从而避免了了解设备设备 状态态和必须须 编编制复杂杂程序的麻烦烦。同时时,BIOS形成了程序与硬件之 间间的缓缓冲,从而保证证了用户软户软 件在某种程度上的兼容性 。 v BIOS驻驻留在系统统板的只读读存储储器ROM中,计计算机加电电 后,可以随时调时调 用BIOS程序。BIOS程序独立于任何操作 系统统,因此无论该计论该计 算机是运行DOS还还是UNIX等其他操 作系统统,用户户都可以调调用这这些服务务程序。 13.4.2 BIOS中断服务务的概念 v BIOS中断类类型中1BH,1CH为伪为伪 中断,1DH1FH为为 BIOS的参数表,10H1AH则对应则对应 不同的BIOS例行中断 服务务程序。用户户可以通过过使用INT 10HINT 1AH进进入中 断服务务程序,这这个过过程就称为为BIOS中断服务务程序调调用。 v 在使用不同的BIOS中断号作BIOS中断调调用时时,如果需要 设设置入口参数,进进而通过过不同的入口参数使用相应应中断 服务务内部的子程序时时,就称为该为该 中断类类型的BIOS功能调调 用。常用的BIOS功能调调用有INT 10H号功能调调用。 v 前面的表13-3中列出了常见见的BIOS中断类类型。 13.4.3 常见的BIOS中断 v BIOS固化在ROM中,对对用户户程序来说说可由特定指令INT n(n为为中断号)通过软过软 件中断的方式使用,这这种工作方 式,称为为BIOS中断服务务程序的调调用。 v 通常把指令INT 10H就称为为BIOS功能调调用,这类这类 似于INT 21H在DOS功能调调用中的地位。这这里的功能调调用是指通 过过入口参数的选择选择 来使用中断服务务程序中的内部功能。 13.4.3 常见的BIOS中断 v 例13-3 屏幕显示方式的设置 v 题目:设置显示方式为320200彩色,并画彩条 v 设计思路:调用INT 10H BIOS功能调用作图 例13-3 屏幕显示方式的设置 v 程序说明: BIOS功能调调用INT 10H 的参数设设置 13.5 DOS和BIOS功能调调用实实例 例13-4 DOS21H号中断0AH号功能号的调用 例13-5 BIOS16H号中断00H号功能号的调用 例13-6 在单色显示方式下以闪烁白色背景高亮下划线方 式显示5个字符“A” 例13-7 图像显示方式下作图实例 例13-8 BIOS 10H号中断01H号功能与02H号功能调用 例13-9 BIOS10H号中断06H号功能调用,上卷屏幕 例13-10 BIOS 10H号中断13H号功能的调用 13.5 DOS和BIOS功能调调用实实例 例13-11 在屏幕上动态显示文本鼠标的位置 例13-12 设置当前盘号为B,读取当前盘号并显示 例13-13 建立一个文件控制块FCB后,建立文件NKU.TXT 例13-14 建立文件控制表后删除文件NKU.TXT 例13-15 由程序建立的FCB指定被读文件名参数,顺序读, 然后显示,功能与DOS下的TYPE命令类似 例13-16 利用扩充文件功能,建立文件并进行读写操作 例13-17 将文件HIDDEN.ASM 变成隐含文件 13.6 典型的中断处处理程序实实例 中断处理程序的编程原则 读取和设置中断向量 13.6.1 13.6.2 13.6.1 中断处理程序的编程原则 v 在编写中断处理程序时要时刻遵守以下的原则: (1)由于中断是异步发生的,当它进入时并不考虑系统当 前运行的状态,所以中断处理程序必须具有自我保护的能 力,并能访问到所有当前段基址和堆栈指针,否则一旦出 现异常情况就难以排除。 (2)在应用具体的中断处理程序之前,应先初始化要处理 的中断向量,使该向量指向相应的中断处理

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论