《汇编语言程序设计》第十三章中断及中断处理程序.ppt

上传人:牧羊曲112 文档编号:5046003 上传时间:2023-05-31 格式:PPT 页数:72 大小:1.07MB
返回 下载 相关 举报
《汇编语言程序设计》第十三章中断及中断处理程序.ppt_第1页
第1页 / 共72页
《汇编语言程序设计》第十三章中断及中断处理程序.ppt_第2页
第2页 / 共72页
《汇编语言程序设计》第十三章中断及中断处理程序.ppt_第3页
第3页 / 共72页
《汇编语言程序设计》第十三章中断及中断处理程序.ppt_第4页
第4页 / 共72页
《汇编语言程序设计》第十三章中断及中断处理程序.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《《汇编语言程序设计》第十三章中断及中断处理程序.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》第十三章中断及中断处理程序.ppt(72页珍藏版)》请在三一办公上搜索。

1、汇编语言程序设计-朱耀庭,南开大学 朱耀庭,第13章中断及中断处理程序,中断在计算机科学中占有十分重要的地位,是计算机科学中最基本的概念之一。如果没有中断以及中断机制的引入与应用,就不可能有计算机操作系统的出现,也就不可能有今天如此高效率的计算机。使用计算机时,操作健盘、移动鼠标之所以能够被计算机感知并且予以及时响应处理,这完全得益于计算机的中断处理。本章将重点介绍80X86 的中断机制及中断处理程序的设计方法,同时还将介绍请求DOS、BIOS中断服务,以及调用DOS、BIOS内部功能子程序(即DOS、BIOS功能调用)的方法和用途等。,南开大学 朱耀庭,第二章 80 x86实模式汇编的运行环

2、境,13.6典型的中断处理程序实例,13.5DOS和BIOS功能调用实例,13.4BIOS中断服务,13.2软件中断,13.1中断及中断相关概念,13.3DOS中断服务,南开大学 朱耀庭,13.1中断及中断相关概念,中断的基本概念中断向量表中断源及中断源的识别中断的分类中断处理机制CPU响应中断的条件中断的优先级,南开大学 朱耀庭,中断的基本概念,在计算机系统中,引入中断的最初目的是为了提高系统的输入输出性能随着计算机应用的发展,中断技术也应用到计算机系统的许多领域,如:多道程序、分时系统、实时处理、程序监视和跟踪等领域。中断就是使中央处理器暂时挂起当前正在进行的工作程序,转向某紧急事件的服务

3、与处理程序,并在执行完该服务与处理程序后,再返回到曾经被其中止和挂起的原有程序处继续完成原有工作的整个过程。,南开大学 朱耀庭,中断向量表,在中断发生后,中断处理程序需要对因各种原因触发的相应中断进行处理。80X86中断系统能处理256种类型的中断,同时给每种中断安排了一个中断类型号,即0H0FFH号中断,每种类型的中断都有相应的中断处理程序。如何有效地管理和保存如此多的中断及其对应的中断处理程序呢?那就是利用中断向量表。中断向量表是一个特殊的线性表,它保存着系统所有中断服务程序的入口地址。在80X86微机系统中,该表保存的256个中断向量分别对应于256种中断类型,每个表项占4个字节,其中两

4、个字节存放中断处理程序的段地址,另两个字节存放中断处理程序的段内偏移量,所以中断向量表为1K字节,它起止于存储器中地址0000H3FFH处,如图13-1所示:,南开大学 朱耀庭,中断向量表,图13-1中断向量表,南开大学 朱耀庭,中断向量表,各个中断处理程序的入口地址在中断向量表中是按中断类型号顺序存放的,因此将中断类型号乘以4就得到对应中断向量的地址。例如,溢出中断的中断类型号为04H,则它的中断向量的地址为04H4=10H,内存地址从10H开始的4个字节中,10H和11H两字节中存放溢出中断程序的偏移地址,12H和13H两字节中存放溢出中断程序的段地址,在发生溢出中断时,将这个偏移地址和段

5、地址分别取出送给寄存器IP和CS,CPU即转向溢出中断处理程序。,南开大学 朱耀庭,中断向量表,表13-1中断类型号和中断向量地址,南开大学 朱耀庭,中断向量表,图13-2以DOS中断INT 20H为例,说明CPU处理各类中断的过程,该过程主要包括以下5个步骤:(1)取中断的中断类型号(2)计算中断向量地址(3)取出中断向量4字节单元中的内容,将其中两字节代表中断处理程序段地址的内容送入CS寄存器,两字节代表中断处理程序偏移量的内容送入IP寄存器(4)转向相应的中断处理程序(5)中断返回到原中断指令的下一条指令处,南开大学 朱耀庭,中断向量表,图13-2中断处理过程,演示动画,注意:这里假设被

6、中断的程序的下一条指令是“MOV AX,0”,事实上也可能是其他指令,南开大学 朱耀庭,中断源及中断源的识别,在中断过程中,我们称引起紧急事务的事件为中断源计算机系统有上百种可以发出中断请求的中断源,但最常见的中断源是:外设的输入/输出请求例如,键盘输入引起的中断,通信端口接收信息引起的中断等还有一些计算机内部的异常事件,例如,0作除数、奇偶校验错等80X86的常见中断源如图13-3所示:,南开大学 朱耀庭,中断源及中断源的识别,图13-380X86中断源,演示动画,南开大学 朱耀庭,中断源及中断源的识别,常见的中断源大致分为CPU外部产生的中断和CPU内部产生的中断。其中外部中断源包括通过N

7、MI引脚传递的非屏蔽中断请求产生的中断和通过Intel 8259A可编程中断控制器的INTR引脚传递的由外部设备产生的中断等。CPU内部中断则包括除法出错中断、单步中断、INTO指令产生的溢出中断和程序中安排的INT n中断指令产生的中断等。外部设备的中断通过8259A的INTR引脚给CPU传送中断信号,8259A还可以使用级联的方式增加连接的外部设备数目。如此多的中断源,CPU是如何确定INTR引脚上的中断信号是来自中断源中的哪一个呢?CPU是通过一定的查询电路来完成的。,南开大学 朱耀庭,中断源及中断源的识别,南开大学 朱耀庭,1.查询中断识别法,查询中断识别法主要是软件查询法,在接受中断

8、请求信号之后,中断识别程序逐个查询连接到系统上的每个设备。当被检查设备的中断请求触发器被置位时,中断识别程序便转向相应的中断服务程序的入口地址处。对于中断源较多的大系统来说,查询中断花费在查询上的时间就太多了,并且还需要有附加的中断识别程序,因此多数系统采用另一种更加方便、快速的中断识别方法向量中断识别法。,南开大学 朱耀庭,2.向量中断识别法,向量中断识别法要求输入/输出设备提供中断信号和设备的标识码,即中断向量,或者提供中断服务程序的入口地址。当CPU响应了某设备的中断请求后,控制逻辑就将该设备的中断服务程序的地址传送至CPU,使CPU跳转到相应的中断服务程序,进而完成中断服务。向量中断识

9、别虽然识别中断源十分快捷,但它需要增加硬件的开销,因此将查询中断识别法和向量中断识别法结合起来使用效果会更好。目前有许多计算机系统就是这样做的。,南开大学 朱耀庭,中断的分类,计算机系统有上百种中断,如何对这些中断的类型进行划分呢?由图13-3中80X86系统的常见中断源可知,可以将中断按中断源划分为内部中断和外部中断。按中断源的特性,中断也可以分为硬件中断和软件中断。硬件中断按中断的屏蔽性质,又可以分为可屏蔽中断和不可屏蔽中断。下面详细介绍一下这几种划分以及它们之间的相互关系。,南开大学 朱耀庭,中断的分类,南开大学 朱耀庭,1.外部中断,外部中断一般是指外部硬件中断,它是处理器外部的硬件设

10、备产生而发向处理器的中断。它分为可屏蔽中断和不可屏蔽中断两种,分别由INTR引脚和NMI引脚的信号触发。(1)不可屏蔽中断不可屏蔽中断是用来处理一些紧急情况,如电源故障、内存或I/O总线的奇偶错误等异常事件。它不能由用户通过指令进行屏蔽,也不受中断允许标志IF的限制。一旦CPU接收到NMI引脚上的信号,就必须立即响应,转向NMI的中断服务程序,硬件将自动完成断点保护和现场保护,并在中断返回时执行一条RETN指令。,南开大学 朱耀庭,1.外部中断,(2)可屏蔽中断可屏蔽中断通常来自外部设备,可以通过指令设置中断控制器的屏蔽参数来禁止某些指定的中断。例如中断控制器8259A有IR0IR7共8级中断

11、,8259A接收来自外设的中断请求信号,并将中断源的中断类型号发送到CPU。在外设发出中断请求到CPU响应中断的过程中有两个控制条件:一是该外设的中断请求是否被屏蔽,该条件由8259A的中断屏蔽寄存器(IMR)控制;另一个是CPU是否允许响应中断,该条件由CPU的标志寄存器(FLAGS)中的中断允许位IF来控制。可以通过置中断屏蔽寄存器来屏蔽相应的中断申请。8259A的中断屏蔽寄存器I/O端口地址是21H,该寄存器的8位对应控制8个外部设备。若某位为0,表示允许该位对应外设的中断请求;若某位为1,则表示该位对应外设的中断请求被屏蔽。,南开大学 朱耀庭,1.外部中断,例如,如图13-3所示,假设

12、只允许系统定时器中断,系统定时器的中断请求对应8259A的IRQ0,于是可如下设置中断屏蔽寄存器:MOVAL,11111110B OUT21H,ALCPU是否响应外设发出的中断请求还与标志寄存器中的中断标志位IF有关。IF为0,CPU禁止响应任何外设请求的中断;IF为1,则CPU可以响应外设的中断请求。在程序中可以通过以下两条指令来设置和清除IF位。STI;开中断,IF=1 CLI;关中断,IF=0在任何类型的中断发生时,CPU将当前的FLAGS入栈,并置IF为0,然后进入中断处理程序。当中断处理程序完成,执行到中断返回指令IRET时,从栈中恢复原FLAGS的值,将IF置1,这时允许新的中断发

13、生。如果需要在一个中断处理程序的执行过程中允许响应另外的中断,也可以使用开中断指令STI。,南开大学 朱耀庭,2.内部中断,内部中断主要包括内部硬件中断和软件中断内部硬件中断是指由某些特殊指令触发的中断 如单步中断 除法出错中断 溢出中断软件中断则是指由指令INT n引起的非屏蔽中断 如DOS中断、BIOS中断和其他自由中断,南开大学 朱耀庭,2.内部中断,(1)除法出错中断除法错的中断类型号为0。除法运算中除数不能为0,因此在程序中不慎写入了除数为零的除法运算,就会产生除数为零的中断。还有一种情况,那就是在除法运算中,所得的商大于某一确定的极值也将引起除法出错中断。例如:MOV DX,34H

14、 MOV AX,5678H MOV BX,1 DIV BX上面的4条指令,是一个双字除以字的运算。结果将商放在AX寄存器中,余数放在DX寄存器中。对于无符号数商的最大允许值为65535,而这里除数BX为1,所以商345678H必然大于65535,因此也将产生一个除法错误。,南开大学 朱耀庭,2.内部中断,(2)溢出中断溢出中断的中断类型号为4。在指令序列中,若上一个指令由于某些特殊的原因使溢出标志OF置1,那么当执行溢出中断指令INTO时会立即产生04H类中断,若OF标志为0,则INTO不起作用。(3)单步中断和断点中断在使用DEBUG调试程序时,会经常使用到T命令和P命令,而这两个命令的执行

15、恰好是利用了内部硬件中断之一的单步中断INT 01H和断点中断INT 03H,它的特征是将陷阱标志TF置位,这样当程序运行时,会在每一条指令的后面产生一个单步中断,从而终止指令的继续执行。,南开大学 朱耀庭,2.内部中断,(4)软件中断CPU在执行完一条INT n指令后,就会立即产生n类软件中断,调用系统中相应的中断处理程序完成中断的功能。其中INT n指令的n为中断类型号。例如,对系统定时器进行控制,则可以在程序中安排一条中断指令:INT1CH当CPU执行到这条指令时,则从中断向量表中1CH4=70H至73H处取4个字节的内容(它们是中断服务程序的偏移量和段地址),自动将其送到IP和CS,然

16、后转向对应的中断服务程序。INT指令可以指定0H0FFH中的任何中断类型号。除系统占用的中断类型号外,用户可以利用保留的中断类型号扩充新的中断处理功能。,南开大学 朱耀庭,中断处理机制,计算机系统中的中断源大致可分为几类,如一般的I/O设备、软件中断、实时钟、故障源等。一个中断系统如果要合理地响应如此多的中断源,就需要具备以下十分完善的“中断处理机制”。(1)当中断源向CPU发出中断请求时,CPU能有权决定是否响应此中断请求,在响应中断请求的情况下要能保护断点,中断处理程序执行完毕后能够正确返回断点处继续执行。(2)中断应具有优先级。在某一时刻如果有许多中断源同时发出中断请求,CPU应能够实现

17、中断优先级排队,即按中断请求的级别来决定先响应哪一个中断,保证首先响应优先级高的中断请求,但同时又要防止低级中断源的中断请求一直得不到CPU响应的现象出现。,南开大学 朱耀庭,中断处理机制,(3)能够实现中断的嵌套。中断源向CPU发出的中断请求是连续不断的,即使已经是响应了某个中断请求而进入相应的中断服务程序,如果这时又有了一个级别更高的中断请求,CPU应该能暂时挂起正在进行的中断服务程序,转而去响应更高优先级的中断请求,响应结束后再返回到原中断处理程序。例如当自己编写的中断服务程序中用到DOS或BIOS提供的中断时,它们就相当于更高级别的中断请求,当CPU响应并进入自己编写的中断服务程序时,

18、如果遇到DOS或BIOS中断,就需暂时挂起自己的中断服务程序转而去响应DOS或BIOS中断。,南开大学 朱耀庭,CPU响应中断的条件,CPU一般是在执行现行指令的最后一个机器指令周期时检测是否有中断请求的,所以在硬件上需要每个中断源都接有一个中断请求触发器,以便能够将中断源产生的中断请求信号锁存起来,并保持到CPU检测完之后。同时,为了在多个中断源请求中断的情况下能够增加控制的灵活性,在硬件上还需要一个中断屏蔽触发器,以决定中断请求被通过还是被屏蔽。此外,在CPU内部还要有一个中断允许触发器,它可以通过STI和CLI指令来设置。即通过STI开中断,使CPU能正常响应中断源的中断请求;而通过CL

19、I关中断,使CPU不响应任何中断请求。,南开大学 朱耀庭,CPU响应中断的条件,因此,CPU响应某个中断请求须满足以下3个条件:(1)中断源置中断请求触发器。由于CPU在每条指令周期结束时才检测是否有中断请求信号,所以中断请求触发器包含一个锁存器,它将中断请求信号锁存起来直到CPU来检测之后再清除。(2)中断源的中断屏蔽触发器未被置位,否则该中断源的所有中断请求将被屏蔽掉。若干中断源的屏蔽触发器可以组成一个中断屏蔽寄存器。(3)CPU内的中断允许触发器置位。当CPU响应中断之后,CPU自动将中断允许触发器复位,即关中断。因此,在中断服务程序中,保护现场后一般情况下应该使用STI指令开中断,使C

20、PU能够继续响应来自其他中断源的更高级别的中断请求,来实现所谓的中断嵌套。当上述3个条件都满足时,如果此时CPU正好处在指令周期的结束并检测到有中断请求时,那么就响应中断并进入中断响应周期。,南开大学 朱耀庭,中断的优先级,多数中断是随机发生的,所以必然会出现某一时刻有多个中断源同时请求中断的情况。CPU在某一时刻只能处理一个中断,因此,它需要决定首先为哪一个中断源服务。CPU根据中断源请求的轻重缓急,预先定义好中断处理的优先级,首先响应紧急的、级别高的中断请求,然后响应级别轻缓的中断请求。当CPU正在处理某一中断时,它还应该能够响应优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求。,南开

21、大学 朱耀庭,中断的优先级,南开大学 朱耀庭,1.软件查询法,软件查询优先级的方法十分简单,它将所有外设的中断请求触发器组合成一个寄存器端口。当CPU接收到中断请求信号时,由一个查询程序来逐位检测中断请求寄存器的状态。先被检测的位,它所对应的中断源是高优先级的;后检测的位,它所对应的中断源是低优先级的。由于软件查询法是通过程序实现查询的,所以当中断源较多时软件查询的时间就会较长。,南开大学 朱耀庭,2.硬件查询法,硬件查询是一种广泛使用的中断优先级排队方式,它通过使用优先权控制器(PIC)莱实现优先级排队。优先权中断控制器是由优先权编码器和比较器等构成的电路,再加上中断请求寄存器、中断屏蔽寄存

22、器共同组成了一个比较完整的中断控制系统。优先权控制器PIC可同时接收8个中断输入。与每一个中断请求位对应的有一个中断屏蔽位,程序设计者可以对中断屏蔽寄存器编程以选择允许的中断。这样可以灵活地调整中断优先级,并可防止出现低级中断永远也得不到响应的情况出现。没有被屏蔽掉的请求信号被送往优先级编码器,其中具有高优先级的中断级由一个8-3编码器转换成3位码,用这个3位码与3位的优先级寄存器进行比较,这个3位的优先级寄存器是由用户自己设定的。用户设定了某一值后,只有优先级高于这个值的中断才能产生中断请求,而等于或低于这个值的所有中断将被屏蔽掉。此外优先级寄存器内还有一位可由用户设置的禁止位,设置禁止位后

23、可使中断优先级比较失效,使中断检测信号不经过比较而直接送到CPU的中断请求线上。,南开大学 朱耀庭,中断嵌套,中断嵌套是指当CPU正在执行某一低级别的中断服务程序时,允许响应更高级别的中断源的中断请求,于是暂时挂起正在处理中的中断,转而进入更高级别的中断服务,待高优先级中断服务结束后,再返回到刚才被中断的那一级,继续执行。由于多重嵌套中断的某些特点,决定了它与单级中断在处理过程中有以下不同之处。(1)在响应更高级中断之前要先屏蔽掉本级和较低级的中断请求,防止干扰;(2)在进行本级中断服务前保护现场后要先开中断,以允许更高级的中断响应,实现中断嵌套;(3)中断服务程序结束后,为了在恢复现场时不受

24、任何中断请求的干扰,必须先关中断;而在中断返回前恢复现场后再执行开中断指令,以允许CPU响应新的中断请求。,南开大学 朱耀庭,13.2软件中断,通过中断向量表管理众多的中断,用户就可以十分方便地为自己建立一个软件中断。当用户想要编制和使用自己的中断服务程序时,先应该确定中断类型;根据中断类型确定该中断在中断向量表中的位置;然后将自己编制的中断服务程序(可以是驻留内存的,也可以是非驻留内存的)所在段的段地址和位移填入中断向量表中对应位置的两个字中。对于软件中断,用户可通过指令INT n中的类型n进行安排。,南开大学 朱耀庭,13.2软件中断,软件中断的处理过程,软件中断的分类,13.2.1,软件

25、中断的访问,南开大学 朱耀庭,软件中断的处理过程,还是以DOS系统功能调用中断INT 20H为例,来说明由软件引起的非屏蔽型中断,当中断指令向CPU发出中断请求时,CPU的处理过程如下。在程序中遇到INT 20H时,该指令产生中断类型号为20H的中断,该中断在中断向量表中的地址为20H4=80H,如图13-2所示。如果在DEBUG提示符“-”后输入命令D 0000:0080 L4,就会得到如下结果:0000:0080 72 10 A7 00 rD是显示内存单元命令;0000:0080是要显示的内存单元的起始地址,冒号前4位16进制数是待显示内存单元的段地址,冒号后4位16进制数是待显示内存单元

26、的偏移量;L定义显示的长度,单位为字节,4表示显示长度值。结果中的“72 10 A7 00”就代表以0000:0080开始的4字节内存单元的16进制内容,结果最右边的“r”是相应字节的ASCII表示,对不可见的字符以“.”代替。,南开大学 朱耀庭,软件中断的处理过程,根据显示的结果看出INT 20H所对应的中断服务程序的入口地址为00A7:1072(注意内存中数据的存放格式是由高到低的)。在接收INT 20H指令后,CPU将自动进行如下的操作。(1)将标志寄存器(FLAGS)压入堆栈。(2)用清中断标志(IF)和陷阱标志(TF)禁止硬件中断,即关中断。当用户编制自己的中断服务程序时,必要时在程

27、序内可以用STI指令开中断,即打开由硬件自动关闭的中断允许触发器,使之能够响应更高级的中断。(3)将当前代码段寄存器(CS)的内容压栈。(4)将当前指令指针(IP)压栈,步骤(3)、(4)的目的是确保中断处理完毕之后能够正确地返回中断调用处。(5)转向内存地址00A7:1072处进入中断服务程序。,南开大学 朱耀庭,软件中断的处理过程,在中断服务程序执行完后,即CPU接收到IRET指令时,又将产生如下的操作。(1)从堆栈中将保存的原指令指针IP的内容弹出到IP中。(2)从堆栈中将保存的原段寄存器CS的内容弹出到CS中。(3)从堆栈中保存的原标志寄存器的状态,再弹出到FLAGS,恢复中断时的标志

28、寄存器状态。由中断处理过程可以看出,软件中断指令非常类似于子程序调用的CALL指令,即:暂停当前程序的执行,转而执行另一程序段,当该程序段执行完时,CPU都自动恢复原程序的执行。,南开大学 朱耀庭,软件中断的处理过程,但两者之间还是有明显区别的。它们的主要差异有以下几点。(1)子程序调用是程序员在编写源程序时事先安排好的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外)。(2)子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序)。(3)子程序的返回指令是RET,而中断服务程

29、序全部是段间的调用,所以在结束时的返回指令是IRET/IRETD。且软件中断的IRET指令具有自动恢复断点和标志的功能。(4)在通常情况下,子程序是由应用系统的开发者来编写的,而中断服务程序是由系统软件设计者来编写的。,南开大学 朱耀庭,软件中断的分类,南开大学 朱耀庭,1.DOS中断,DOS中断占用的中断类型号为20H3FH,目前使用了其中的20H27H和2FH,其余的为保留中断。其中每种DOS中断类型号与其对应的功能见表13-2。,南开大学 朱耀庭,2.BIOS中断,BIOS中断占用的中断号为10H1FH。它主要是供I/O驱动程序使用,提供了应用程序、DOS与设备的接口功能。用户可以忽略对

30、具体设备硬件上的了解,直接应用这些功能调用完成对具体设备的控制,其中常见的BIOS中断类型号与其对应的功能见表13-3。,南开大学 朱耀庭,3.自由中断,自由中断是由系统或应用程序设置开发的。可以理解为这类中断是系统或应用程序为了完成特定的功能而扩展出来的中断,它们占用了中断向量表中80H0FFH的位置。系统给自身和应用程序留下了很大的余地。这几类软件中断之间存在一定的层次关系。在用户程序中,若直接通过端口来操作硬件或外设,处理速度是最快的,但这样做,使用户程序存在很大的局限性。硬件环境的改变将直接影响程序的正常运行。若用户程序通过调用DOS功能来实现其所需功能,那么,应用程序与低层硬件相距较

31、远,操作最终的对象需要经过中间环节,处理速度肯定受到一定的损失,但这种应用程序适应性强、应用范围广、对硬件的依赖性最小。,南开大学 朱耀庭,3.自由中断,由于BIOS介于DOS和具体硬件之间,所以,调用BIOS的功能是一个很好的折中方案。用户可在以下3种情况下考虑使用BIOS的功能:(1)BIOS提供的功能,而DOS没有提供该功能。(2)不能利用DOS功能调用的情况(可能因为某些具体应用的限制)。(3)基于处理速度的考虑,需要绕过DOS层的情况。可以看出使用中断的层次越高,它与硬件设备相关程度就越低,处理速度也就越低,但用户程序的适用范围较广;使用中断的层次越低,它与硬件设备相关程度越高,处理

32、速度越快,用户程序的适用范围较小。因此程序员可根据应用程序的要求、对硬件环境的熟悉程度等因素来选用不同层次的中断。,南开大学 朱耀庭,软件中断的访问,软件中断的访问在不同的环境中有不同的形式,这里仅介绍一下汇编语言对软件中断的访问。用汇编语言申请一个标准DOS或BIOS中断是非常简单的,用户程序通过规定的寄存器与中断服务程序之间进行内定的规范信息交换。DOS中断和BIOS中断都是在中断调用前将功能号装入AH寄存器,将子功能号装入AL寄存器,此时对于大部分的中断处理程序都有一个入口和出口,在CPU的相应寄存器中装入入口参数,在中断请求完毕之后就可通过特定的CPU寄存器获得出口参数返回值。这里需要

33、注意的是,进行中断调用时,在INT指令中指明的是中断类型号,而在AH或AL寄存器中装入的是功能号,其余寄存器在调用中断处理程序前用来保存入口参数,AH或AL寄存器与其余寄存器在中断处理完毕后可能保存的是出口参数值。这里可以将DOS中断和BIOS中断每类不同中断类型号中的各种功能号的调用称为DOS功能调用和BIOS功能调用。,南开大学 朱耀庭,软件中断的访问,它们一般包含以下步骤,步骤的过程如图13-4所示:(1)将调用参数装入指定寄存器;(2)如需功能号,将它装入AH寄存器;(3)如需子功能号,将它装入AL寄存器;(4)按中断类型号使用INT指令调用DOS或BIOS中断;(5)检查返回参数是否

34、正确。,南开大学 朱耀庭,软件中断的访问,图13-4n号中断功能调用步骤,演示动画,南开大学 朱耀庭,软件中断的访问,例如,DOS系统功能调用的21H号中断,其01H号功能调用是用来从键盘读一个字符到AL寄存器,并在屏幕上显示。该功能调用没有其他入口参数,只需往AH寄存器中装入01H,然后使用INT 21H指令,则调用完毕后,出口参数AL寄存器中就存放了从键盘读入字符的ASCII码。可以根据需要对AL中的值作进一步的处理。再如,21H号中断的02H号功能是在显示器上显示输出一个字符,其入口参数为在DL寄存器中存放待显示字符的ASCII码;又如,21H号中断的4CH号功能调用是用来结束程序等。,

35、南开大学 朱耀庭,软件中断的访问,例13-1DOS系统功能调用示例题目:输入一个字符,原样输出该字符设计思路:INT 21H的1号、2号功能调用,分别完成输入输出源程序(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程序说明:DOS功能调用及其参数设置详见参考资料26。DOS中断和BI

36、OS中断是软件中断中两类比较重要的中断,本章下面的内容将重点介绍这两类中断。,南开大学 朱耀庭,13.3DOS中断服务,DOS中断服务的概念,常用的DOS中断,13.3.1,南开大学 朱耀庭,DOS中断服务的概念,中断类型号20H27H为DOS所使用的中断,28H3FH为DOS所保留。用户可以通过INT 20HINT 27H进入DOS中断服务程序,称其为对DOS中断服务程序的调用。同样通过对入口参数的选择而调用INT 20HINT 27H服务程序的内部子程序时,称这一调用为DOS内部功能调用,简称DOS功能调用。,南开大学 朱耀庭,常用的DOS中断,例13-2DOS 25H号中断,按逻辑扇区读

37、盘题目:从驱动器A中的磁盘中逻辑0扇区开始读入一个扇区的信息,然后按十六进制的形式显示该扇区的前8个字节。设计思路:用DOS 25H号中断读盘,例13-2DOS 25H号中断,按逻辑扇区读盘,程序说明:运行结果为: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.4BIOS中断服务,BIOS的概念,BIOS中断服务的概念,13.4.1,常见的BIOS中断,

38、南开大学 朱耀庭,BIOS的概念,BIOS即Basic Input/Output System,指的是基本输入/输出系统。它是一组底层的基础软件程序。当执行设备驱动模块或进行字符级I/O操作时,它为用户提供了一个相对简单的编程接口,使用户能在不涉及设备地址及工作特性的情况下编程,从而避免了了解设备状态和必须编制复杂程序的麻烦。同时,BIOS形成了程序与硬件之间的缓冲,从而保证了用户软件在某种程度上的兼容性。BIOS驻留在系统板的只读存储器ROM中,计算机加电后,可以随时调用BIOS程序。BIOS程序独立于任何操作系统,因此无论该计算机是运行DOS还是UNIX等其他操作系统,用户都可以调用这些服

39、务程序。,南开大学 朱耀庭,BIOS中断服务的概念,BIOS中断类型中1BH,1CH为伪中断,1DH1FH为BIOS的参数表,10H1AH则对应不同的BIOS例行中断服务程序。用户可以通过使用INT 10HINT 1AH进入中断服务程序,这个过程就称为BIOS中断服务程序调用。在使用不同的BIOS中断号作BIOS中断调用时,如果需要设置入口参数,进而通过不同的入口参数使用相应中断服务内部的子程序时,就称为该中断类型的BIOS功能调用。常用的BIOS功能调用有INT 10H号功能调用。前面的表13-3中列出了常见的BIOS中断类型。,南开大学 朱耀庭,常见的BIOS中断,BIOS固化在ROM中,

40、对用户程序来说可由特定指令INT n(n为中断号)通过软件中断的方式使用,这种工作方式,称为BIOS中断服务程序的调用。通常把指令INT 10H就称为BIOS功能调用,这类似于INT 21H在DOS功能调用中的地位。这里的功能调用是指通过入口参数的选择来使用中断服务程序中的内部功能。,南开大学 朱耀庭,常见的BIOS中断,例13-3屏幕显示方式的设置题目:设置显示方式为320200彩色,并画彩条设计思路:调用INT 10H BIOS功能调用作图,例13-3屏幕显示方式的设置,程序说明:BIOS功能调用INT 10H 的参数设置,南开大学 朱耀庭,13.5DOS和BIOS功能调用实例,例13-4

41、DOS21H号中断0AH号功能号的调用 例13-5BIOS16H号中断00H号功能号的调用 例13-6 在单色显示方式下以闪烁白色背景高亮下划线方式显示5个字符“A”例13-7 图像显示方式下作图实例 例13-8 BIOS 10H号中断01H号功能与02H号功能调用例13-9 BIOS10H号中断06H号功能调用,上卷屏幕 例13-10 BIOS 10H号中断13H号功能的调用,南开大学 朱耀庭,13.5DOS和BIOS功能调用实例,例13-11 在屏幕上动态显示文本鼠标的位置 例13-12 设置当前盘号为B,读取当前盘号并显示 例13-13 建立一个文件控制块FCB后,建立文件NKU.TXT

42、 例13-14 建立文件控制表后删除文件NKU.TXT 例13-15 由程序建立的FCB指定被读文件名参数,顺序读,然后显示,功能与DOS下的TYPE命令类似 例13-16 利用扩充文件功能,建立文件并进行读写操作 例13-17 将文件HIDDEN.ASM 变成隐含文件,南开大学 朱耀庭,13.6 典型的中断处理程序实例,中断处理程序的编程原则,读取和设置中断向量,13.6.1,南开大学 朱耀庭,中断处理程序的编程原则,在编写中断处理程序时要时刻遵守以下的原则:(1)由于中断是异步发生的,当它进入时并不考虑系统当前运行的状态,所以中断处理程序必须具有自我保护的能力,并能访问到所有当前段基址和堆

43、栈指针,否则一旦出现异常情况就难以排除。(2)在应用具体的中断处理程序之前,应先初始化要处理的中断向量,使该向量指向相应的中断处理程序。注意,在修改中断向量时,要先关中断以防止发生由其他中断造成的不可预测的后果,在初始化完毕后再开中断。,南开大学 朱耀庭,中断处理程序的编程原则,在编写中断处理程序时要时刻遵守以下的原则:(3)当CPU响应一个中断时(包括硬件中断和软件中断),中断处理程序接受控制的系统状态是相同的,即状态标志字、CS和IP进栈保存并关中断。因而中断处理程序在保护好现场后,必要时应立即开中断,以允许高级中断产生。(4)开发用以替换系统内中断处理程序或系统异常的中断处理程序时,必须

44、遵守系统的有关约定,以免破坏系统向量或使DOS处于不稳定状态。(5)现在所使用的DOS版本是不支持重入的,所以在DOS下运行一个外部硬件中断处理程序时,程序中绝对不允许使用INT 21H。,南开大学 朱耀庭,读取和设置中断向量,中断向量是系统用来存放中断服务程序或系统参数的入口地址。在通常情况下,程序员不需要对中断向量表作任何操作,但在开发程序时,若要为某种特殊需要而提供新的中断处理程序时,就必须操作中断向量表。,南开大学 朱耀庭,读取和设置中断向量,南开大学 朱耀庭,1.读取中断向量,(1)DOS功能调用的方法DOS提供了用功能调用的方法来读取中断向量的功能,例如,其中断21H的功能35H就

45、能读取指定中断号的入口地址。其使用参数如下:入口参数:AH35H,AL中断号 出口参数:ES:BX中断处理程序的入口地址,例13-18用功能调用的方法把中断n=5的入口地址保存到双字变量OldAddr中,南开大学 朱耀庭,1.读取中断向量,(2)直接访问存储单元的方法由前面的知识可知:中断向量表是存储在内存的第0段 若中断号为n,那么,其入口地址在表内的偏移量为4n,例13-19用直接访问存储单元的方法把中断n=5的入口地址保存到双字变量OldAddr中,南开大学 朱耀庭,2.设置中断向量,(1)DOS功能调用的方法中断21H的功能25H可为指定的中断号设置新的入口地址。其使用方法如下:入口参

46、数:AH中断号,DS:DX中断处理程序的入口地址 出口参数:无,例13-20用功能调用的方法设置中断n的中断处理程序,南开大学 朱耀庭,2.设置中断向量,(2)直接访问存储单元的方法,例13-21用直接访问存储单元的方法设置中断n的中断处理程序,在上面的程序段中,指令CLI是一条值得注意的指令,它用来确保随后两条MOV指令可以被连续执行而不被打断。这是因为执行第一条MOV指令后,原中断向量表中的入口地址就被破坏了,这时,该入口地址既不指向原处理程序,也不指向新处理程序。如果此刻正巧发生了该类型的中断请求,那么,系统将转向一个非法的位置。如果程序员能确信此时不会发生该类型的中断请求,当然也就不必

47、插入关中断指令。后面的指令STI是开中断指令,它允许CPU响应其后的中断请求,南开大学 朱耀庭,3.修改中断向量的步骤,在编程的实际过程中,若要修改某个具体的中断处理程序时,一般需要按下面的操作过程来完成:(1)读取指定中断的中断处理程序的入口地址,并把它保存在存储单元内;(2)把用户编写的程序段设置为指定中断的新处理程序;(3)在用户程序结束之前(或不需要新的处理程序时),把步骤(1)保存的入口地址恢复成处理该中断的入口地址。程序员按以上3步来编程,可保证:在其程序运行过程中,该指定的中断将按新的处理程序来处理,程序结束后,中断系统又恢复成原来的处理方式。所以,这种中断向量的改变对其他程序或使用者来说是透明的,当然也就不会影响它们的正常运作。下面用一个具体的例子来说明中断程序的写法:,例13-22重写INT 5中断处理程序,南开大学 朱耀庭,Thank You!,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号