还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第七章中断调用和中断服务程序中断调用是指计算机暂时停止当前执行程序,转移到另一程序执行,执行结束后返回前面的程序继续执行中断调用类似于过程调用,和过程调用不同的是,中断调用可以通过硬件,或者指令INT实现,前者称为硬中断调用,后者称为软中断调用中断所调用的过程称为中断服务程序在IBM-PC计算机系统中,中断服务程序一般是计算机系统所提供的一组程序,用于完成输入输出等操作程序员编写程序时,可在应用程序中直接调用中断服务程序,完成输入输出等操作,这给程序设计带来极大的方便中断服务程序可分为两部分一部分驻留在ROM中,称为BIOS;另一部分由操作系统程序提供DOS操作系统提供的中断服务程序保存在磁盘文件中(IO.SYS和IBMDOS.SYS),在系统启动后装入内存对于同一功能操作,一般既能选择调用DOS中断服务程序,也能选择BIOS中断服务程序例如,通过键盘输入一个字符,可以调用DOS中断21H的01H子功能,也可以调用BIOS中断16H的01H子功能因为BIOS比DOS更靠近硬件,因此建议尽可能使用DOS功能,但是,在有些情况下必须使用BIOS功能,因为没有对应的等效的DOS功能BIOS和DOS的中断服务程序能处理大多数的输入输出操作,但是,有一些功能还没有提供,这就要考虑使用I/O指令在端口级上编程,这就需要详细了解端口的工作原理本章概要介绍BIOS和DOS这两部分中断服务程序,及其调用方法§
7.1中断向量和中断服务程序
一、中断号和中断号分配IBM-PC计算机系统给每个中断服务程序分配一个顺序编号,该编号称为中断号中断号分配如下1.CPU内部控制的中断服务程序0号除0中断,当程序发生除0错误时系统自动执行该中断服务程序;1号单步执行,当单步执行程序时,每执行一条指令后暂停程序执行;2号不可屏蔽中断,分配给由CPU的不可屏蔽中断申请;3号断点,程序执行到设置的断点时执行该中断服务程序;4号溢出,产生溢出错误时执行;5号打印屏幕,当按下PrintScreen键时执行;6号保留;7号保留2.中断控制器控制执行的中断服务程序输入输出中断是由中断控制器控制执行的中断服务程序,IBM-PC计算机的中断控制器有IRQ0~IRQ7八个输入端,其占用的中断号如下08H号时钟中断(IRQ0),每秒钟执行
18.2次;09H号键盘中断(IRQ1);0AH号保留;0BH号通讯口COM2IRQ3;0CH号通讯口COM1IRQ4;0DH号LPT2IRQ5;0EH号磁盘控制器IRQ6;0FH号LPT1IRQ7;如果用两片中断控制器芯片以级连方式工作,其IRQ8~IRQ15对应中断号为70H~77H对应的中断服务程序可查阅相关手册3.BIOS软中断服务程序软中断是指通过INT指令调用的中断服务程序,经常使用的几个重要的中断服务程序的中断号分配如下10H显示器输入输出控制;13H磁盘存取;14HRS-232串行口通讯;16H键盘输入17H打印输出19H引导装入程序1AH时钟4.DOS软中断服务程序中断号20H~2FH分配给DOS系统,其中包括前面介绍过的21H号中断,为DOS系统功能调用这里不作具体介绍,如果要详细了解可以查阅有关书籍或技术手册
二、中断向量和中断向量表中断服务程序的入口地址称为中断向量,由段基址和偏移地址两部分组成DOS系统在启动时将所有中断程序的入口地址按中断号顺序存放在内存的00000000~000003FF空间,称为中断向量表每个中断向量在中断向量表中占四个字节,前两个字节为中断服务程序入口的偏移地址,后两个字节为段基址只要知道某个中断服务程序的中断号,用中断号乘4,就可以计算出该中断服务程序入口地址存放在中断向量表的何处例如DOS系统功能服务程序的中断号为21H,其中断向量存放在地址00000084H处使用DEBUG程序可以查看DOS系统功能服务程序的入口地址-D0:840000:00804504A708-4F03F00B8A03F00BE...O.......0000:00901703F00BBC0FC900-C60FC900D00FC
7.2BIOS中断服务程序调用由计算机厂商提供的BIOS中断服务程序固化在ROM内,计算机启动后,这些中断服务程序的入口地址被装入中断向量表,用户可以通过硬件方式,或软中断方式调用BIOS中的中断服务程序下面通过示例说明BIOS的键盘输入和视频输出中断服务程序的使用
一、键盘中断服务程序键盘中断服务程序中断号为16H,包含0H、1H、2H三个子功能0h号子功能读键盘输入的字符当调用该子功能时,计算机等待接收键盘输入如果没有按键按下,则等待;如果有按键按下,则将按键的扫描码装入AH寄存器,将按键的ASCII码装入AL寄存器因为键盘上的功能键,如,F
1、F
2、…等,没有对应的ASCII码,所以,当按下的如果是功能键,AL=0,AH=对应键的扫描码因此,可以调用0h号子功能识别是否有功能键按下01H号子功能从键盘缓冲区读一个字符,当键盘缓冲区不为空时,将__置0,将读取的ASCII码装入AL寄存器;当键盘缓冲区为空时,将__置1后返回02H号子功能读取双态键,或组合键的状态,返回值AL的对应位含义如图
7.
2.1所示图
7.
2.1键盘状态字节例721调用键盘中断0H子功能,接收一个按键,如果是功能键F1打印字母“A”,如果是其它功能键打印字母“B”,否则不打印DISP__CROX;;显示字符宏定义MOVDLXMOVAH02HINT21HENDM.MODEL__ALL.CODESTART:MOVAH0INT16H;调用中断16h的0号子功能CMPAL0;是功能键否?JNEEXIT;不是功能键,结束CMPAH__H;是功能键F1否?__是功能键F1的扫描码JNEF2DISPAJMPEXITF2:DISPBEXIT:MOVAH4CHINT21HENDSTART例722分别调用16H的01h和0H子功能接收键盘输入,并打印输入健的ASCII码ROL14__CROZ;循环左移四次宏定义PUSHCXMOVCL4ROLZCLPOPCXENDMDISP__CRO;显示字符宏定义PUSHAXMOVAH02HINT21HPOPAXENDM.MODEL__ALL.CODEOUT16PROCNEAR;十六进制数输出过程MOVCX2L1:ROL14ALMOVDLALANDDL0FHCMPDL9JBEL2ADDDL7L2:ADDdl30hDISPLOOPL1MOVDLHDISPRETOUT16ENDP调用01H子功能START:L3:MOVAH1INT16H;调用中断16h的01H号子功能JZL3;键盘缓冲如果为空返回L3CALLOUT16;调用十六进制数输出子程序MOVAH4CHINT21HENDSTART调用0H子功能START:MOVAH0INT16H;调用中断16h的0号子功能CALLOUT16;调用十六进制数输出子程序MOVAH4CHINT21HENDSTART有上面例子可以看到中断16H的0H子功能和DOS系统功能调用的01H子功能几乎是相同的,在程序中到底应当调用那一个好呢?一般来说如果不是特殊需要应尽量使用DOS系统功能
二、视频输出中断服务程序不同的显示控制器,显示输出的特性不同,主要包括显示分辨率和对图形的支持目前PC计算机多采用__GA显示控制器,__GA显示控制器兼容以前的CGA、EGA、和VGA所支持的特性显示输出系统有多种工作模式,可以分为字符模式和图形模式两大类,每一类又可按分辨率和颜色数分成不同的子模式例如字符模式可以有25行×40列、25行×80列等模式;图形模式可以有分辨率640×480,16种颜色;或分辨率640×480,256种颜色等字符模式下显示字符存入显示缓存,就会在显示器上显示出来分为字符模式下的显示缓存的开始内存地址B8000H显示缓存区分为若干页,每一页和一满屏数据相对应,使用时可以选择其中的一页每个显示字符占用两个字节,前一个字节为字符的ASCII码,后一个字节为字符模式字符的属性字符属性字节定义如下位0~位2字符颜色,000黑色字符,001带下划线,111白色字符等位3字符亮度,0普通亮度,1高亮度位4~位背景颜色,000黑色背景,111白色背景位7字符闪烁,0普通字符,1闪烁字符图形模式的每个像素数据位数取决于可选择的颜色,例如640×480,16色模式,每个像素需要4位二进制数,全屏共需要640×480×
0.5=153600字节图形模式将显示缓存区分成4个存储位平面,其开始地址为A0000H,每个位平面存储像素的一位,各个位平面的顺序号相同位组合成屏幕上一个像素DOS系统将中断号10H分配给视频输出中断服务程序10H中断包含0H~13H子功能下面介绍其中几个子功能1.06H子功能功能当前显示页上滚输入参数AL=上滚行数,0为初始化窗口(全屏幕)BH=字符填充属性CH/CL=左上角行/列坐标DH/DL=右下角行/列坐标2.02H子功能功能置光标位置输入参数BH=显示页号DH=行号DL=列号3.09H子功能功能在当前光标位置显示字符输入参数BH=显示页号BL=显示字符属性CX=重复次数其中字符属性的各位定义如下图
7.
2.2字符属性例723在显示器的指定位置显示文字.MODEL__ALL.DATASTRDBHowAreYou!COUNTEQU$-OFFSETSTR.CODESTART:MOVAL0;AL=上卷行数,AL=0为清屏MOVCL0;开始行号MOVCH0;开始列号MOVDL79;结束行号MOVDH24;结束列号MOVBH7;卷入行属性为黑底白字MOVAH06H;子功能号06H送AH寄存器INT10H;调用10H的06H子功能清屏幕MOVDH10;置光标到10行,33列MOVDL33;光标列号MOVBH0;置显示页号MOVAH2INT10H;调用02H子功能设置光标位置MOVAX@DATAMOVDSAXMOVSIOFFSETSTRMOVBL01110110B;设置字符属性白底红字MOVCXCOUNTL1:PUCHCX;循环次数=显示字符数MOVCX1;显示重复次数MOVAH9;调用09h子功能显示字符MOVAL[SI];显示字符ASCII码装入AL寄存器INT10H;显示字符INCSIINCDI;;光标左移MOVAH2INT10H;重置光标位置POPCXLOOPL1EXIT:MOVAH4CHINT21HENDSTART运行上面程序在显示器的10行,33列开始显示白底红字的“Howareyou!”例724在显示器上画一条20个像素的直线下面程序调用了10H功能的0H和0CH子功能0号子功能置显示模式,AL=显示模式代码,当AL=12H时的显示模式为640×480像素,16色模式;0CH子功能在屏幕上绘点,DX=开始行,CX=开始列,AL=颜色编码.MODEL__ALL.CODESTART:MOVAL12HMOVAH0INT10H;设置640×480,16色模式MOVDX40;初始行MOVCX50;开始列L1:MOVAH0CH;调用写像素功能MOVAL7;设置颜色为白色INT10H;画点INCCX;列数增1CMPCX70JNEL1EXIT:MOVAH4CHINT21HENDSTART§
7.3硬中断
一、中断控制器除了通过INT指令调用中断服务程序,微型计算机可以通过硬件调用中断服务程序控制硬中断的芯片是中断控制器,如早期的PC计算机使用Intel的8259中断控制器芯片,现在微机的中断控制器和其它一些部件一起集成为一块超大规模集成电路中断控制器占用20h和21h两个I/O端口1.20h对应中断控制器中的命令寄存器,可由CPU将中断控制命令代码写入到该寄存器,以控制中断控制器的工作方式例如,20H为停止中断控制器工作代码,使用下面指令将结束中断MOVAL20HOUT20HAL其中OUT指令是I/O输出指令,其执行的操作是将AL寄存器中的代码发送到外设端口20H中断控制器的其它命令需要了解中断控制器的内部结构和工作原理,过于复杂这里略去2.端口21h对应中断屏蔽寄存器,这是一个8位的寄存器,每一位和一个外部设备的中断__相对应,将其中的某位置1,就会禁止该位对应的外部设备中断申请DOS系统将如下中断号分配给硬中断服务程序08H时钟中断(IRQ0),每秒钟执行
18.2次;09H键盘中断(IRQ1);0AH保留;0BH通讯口COM2IRQ3;0CH通讯口COM1IRQ4;0DHLPT2IRQ5;0EH磁盘控制器IRQ6;0FHLPT1IRQ7;为了接入更多的外部设备,在微型计算机中将两片中断控制器芯片级连方式在一起,其IRQ8~IRQ15对应中断号为70H~77H
二、中断控制器的工作原理当有外部设备发出中中断申请__时,中断控制器向CPU的可屏蔽中断输入端发出中断申请__,并同时将其对应的中断号通过数据__送到CPU,CPU接到中断控制器的__后,暂时中止执行正在执行的程序,根据中断控制器发来的中断号计算中断服务程序入口地址在中断向量表中的位置,将中断向量装入CS:IP,开始执行中断服务程序,中断服务程序执行结束后继续执行原来的程序除了可以通过中断屏蔽寄存器屏蔽某外设的中断申请,将IF标志位置0,可以屏蔽所有中断控制器的中断申请指令CLI将IF置零,关中断;STI将IF置1,开中断§
7.4中断程序设计有时用户需要设计自己的中断服务程序,用户设计的中断服务程序可以占用DOS系统为用户保留的中断号中断服务程序应当遵循如下操作步骤1.中断服务程序应保护现场将用到的寄存器压如堆栈保护;2.关中断,禁止其它中断申请;3.中断处理;4.开中断;5.向中断控制寄存器发出中断结束命令;6.恢复现场;7.返回下面程序是中断程序设计的示例该程序中的RING过程为中断执行程序,当每次时钟__到来时执行该过程一次每次执行检查变量COUNT的值,如果COUNT等于100就显示字符串Thebellisring!,然后将COUNT清0;如果COUNT小于100不显示字符串,只是将COUNT增1后返回.MODEL__ALL.DATAMESSDBThebellisring!0DH0AH$COUNTDW
1.CODERINGPROCNEARPUSHDSPUSHUAXPUSHCXPUSHDX;保护现场,将DS、AX、CX、DX值压入堆栈MOVAX,@DATAMOVDSAXCLI;关中断INCCOUNTCMPCOUNT100JNZEXITMOVDXOFFSETMESSMOVAH09HINT21H;调用DOS的09H功能显示字符串MOVCOUNT0;恢复COUNT值EXIT:STI;开中断MOVAL20HOUT20HAL;发中断结束命令POPDXPOPCXPOPAXPOPDS;恢复现场IRET;中断返回RINGENDP__INPROCFARSTART:MOVAL1CH;中断号1CH送AL寄存器MOVAH35HINT21H;调用DOS的35H功能,取1CH号中断向量PUSHESPUSHBX;保存原中断向量MOVDXOFFSETRING;变量RING的偏移地址送DXMOVAXSEGRINGMOVDSAX;取变量RING的段基址,送DSMOVAL1CHMOVAH25HINT21H;调用DOS的25H功能,置1CH号中断向量L1:MOVAH01H;读键盘缓冲区INT16HCMPAL0DHJNEL1;__=0,没有键按下返回L1POPDXPOPESMOVAL1CHMOVAH25HINT21H;恢复原1CH中断向量MOVAH4CHINT21H__INENDPENDSTART程序说明1.1CH中断为DOS系统为用户程序保留的时钟中断,实际上08H中断直接调用该中断系统内部时钟每隔
18.2秒就向中断控制器发出一次中断请求__,CPU响应该中断请求,执行1CH号中断服务程序2.DOS的35H功能为取中断向量入口参数AL=中断号出口参数ES BX=中断向量上面程序通过35H功能调用取出原中断向量值,将其压入堆栈保存3.DOS的25H功能为设置中断向量入口参数DS DX=中断向量,AL=中断号出口参数无程序通过25H功能调用将过程RING的段基址和偏移地址存入中断向量表4.IRET为中断返回指令CPU接到中断请求__后,将当前执行程序的下一指令的地址压入堆栈保存后,响应中断,并执行中断服务程序中断服务程序由IRET指令将保存在堆栈中的指令地址弹出到CS IP,返回到被中断的程序5.由标号L1开始的程序段调用键盘中断16H的01H子功能循环扫描键盘,在循环过程中每间隔
18.2秒响应一次时钟中断请求,执行RING过程D7D6D5D4D3D2D1D0按下右shift键按下左shift键按下Ctrl键按下Alt键Scrollock键状态Numlock键状态Capslock键状态Insert键状态Scrollock键状态BLRGBIRGB背景前景亮度闪烁PAGE10。