汇编语言与计算机原理第七章.doc

上传人:scccc 文档编号:11254935 上传时间:2021-07-18 格式:DOC 页数:12 大小:64.50KB
返回 下载 相关 举报
汇编语言与计算机原理第七章.doc_第1页
第1页 / 共12页
汇编语言与计算机原理第七章.doc_第2页
第2页 / 共12页
汇编语言与计算机原理第七章.doc_第3页
第3页 / 共12页
汇编语言与计算机原理第七章.doc_第4页
第4页 / 共12页
汇编语言与计算机原理第七章.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《汇编语言与计算机原理第七章.doc》由会员分享,可在线阅读,更多相关《汇编语言与计算机原理第七章.doc(12页珍藏版)》请在三一文库上搜索。

1、第七章 中断调用和中断服务程序中断调用是指计算机暂时停止当前执行程序,转移到另一程序执行,执行结束后返回前面的程序继续执行。中断调用类似于过程调用,和过程调用不同的是,中断调用可以通过硬件,或者指令INT实现,前者称为硬中断调用,后者称为软中断调用。中断所调用的过程称为中断服务程序。在IBM-PC计算机系统中,中断服务程序一般是计算机系统所提供的一组程序,用于完成输入输出等操作。程序员编写程序时,可在应用程序中直接调用中断服务程序,完成输入输出等操作,这给程序设计带来极大的方便。中断服务程序可分为两部分:一部分驻留在ROM中,称为BIOS;另一部分由操作系统程序提供。DOS操作系统提供的中断服

2、务程序保存在磁盘文件中(IO.SYS和IBMDOS.SYS),在系统启动后装入内存。对于同一功能操作,一般既能选择调用DOS中断服务程序,也能选择BIOS中断服务程序。例如,通过键盘输入一个字符,可以调用DOS中断21H的01H子功能,也可以调用BIOS中断16H的01H子功能。因为BIOS比DOS更靠近硬件,因此建议尽可能使用DOS功能,但是,在有些情况下必须使用BIOS功能,因为没有对应的等效的DOS功能。BIOS和DOS的中断服务程序能处理大多数的输入输出操作,但是,有一些功能还没有提供,这就要考虑使用I/O指令在端口级上编程,这就需要详细了解端口的工作原理。本章概要介绍BIOS和DOS

3、这两部分中断服务程序,及其调用方法。7.1 中断向量和中断服务程序一、中断号和中断号分配IBM-PC 计算机系统给每个中断服务程序分配一个顺序编号,该编号称为中断号。中断号分配如下:1CPU内部控制的中断服务程序:0号:除0中断,当程序发生除0错误时系统自动执行该中断服务程序;1号:单步执行,当单步执行程序时,每执行一条指令后暂停程序执行;2号:不可屏蔽中断,分配给由CPU的不可屏蔽中断申请;3号:断点,程序执行到设置的断点时执行该中断服务程序;4号:溢出,产生溢出错误时执行;5号:打印屏幕,当按下PrintScreen键时执行;6号:保留;7号:保留。2中断控制器控制执行的中断服务程序:输入

4、输出中断是由中断控制器控制执行的中断服务程序,IBM-PC计算机的中断控制器有IRQ0IRQ7八个输入端,其占用的中断号如下:08H号: 时钟中断(IRQ0), 每秒钟执行18.2次;09H号: 键盘中断(IRQ1);0AH号: 保留;0BH号: 通讯口COM2(IRQ3);0CH号: 通讯口COM1(IRQ4);0DH号: LPT2(IRQ5);0EH号: 磁盘控制器(IRQ6);0FH号: LPT1(IRQ7);如果用两片中断控制器芯片以级连方式工作,其IRQ8IRQ15对应中断号为70H77H。对应的中断服务程序可查阅相关手册。3BIOS软中断服务程序:软中断是指通过INT指令调用的中断

5、服务程序,经常使用的几个重要的中断服务程序的中断号分配如下:10H 显示器输入输出控制;13H 磁盘存取;14H RS-232串行口通讯;16H 键盘输入17H 打印输出19H 引导装入程序1AH 时钟4DOS软中断服务程序:中断号20H2FH分配给DOS系统,其中包括前面介绍过的21H号中断,为DOS系统功能调用。这里不作具体介绍,如果要详细了解可以查阅有关书籍或技术手册。二、中断向量和中断向量表中断服务程序的入口地址称为中断向量,由段基址和偏移地址两部分组成。DOS系统在启动时将所有中断程序的入口地址按中断号顺序存放在内存的0000:00000000:03FF空间,称为中断向量表。每个中断

6、向量在中断向量表中占四个字节,前两个字节为中断服务程序入口的偏移地址,后两个字节为段基址。只要知道某个中断服务程序的中断号,用中断号乘4,就可以计算出该中断服务程序入口地址存放在中断向量表的何处。例如DOS系统功能服务程序的中断号为21H,其中断向量存放在地址0000:0084H处。使用DEBUG程序可以查看DOS系统功能服务程序的入口地址:-D 0:840000:0080 45 04 A7 08-4F 03 F0 0B 8A 03 F0 0B E.O.0000:0090 17 03 F0 0B BC 0F C9 00-C6 0F C9 00 D0 0F C9 00 .0000:00A0 6C

7、 10 C9 00 66 04 70 00-B4 05 1E 03 6C 10 C9 00 l.f.p.l.0000:00B0 6C 10 C9 00 6C 10 C9 00-62 01 0F 0A CC 01 10 0A l.l.b.0000:00C0 EA E4 0F C9 00 EF 00 F0-6C 10 C9 00 01 00 88 09 .l.可以看到其入口地址为08A7:0445(注意低地址存放的是低字节,高低址存放的是高字节)。实际上知道了某个中断服务程序的入口地址,也可以通过CALL指令调用该中断服务程序,例如DOS功能调用的入口地址为08A7:0445,可以通过指令“CAL

8、L 08A7:0445”调用DOS功能。进入DEBUG,使用“A”命令输入下面程序段:-A126B:0100 MOV AH, 02126B:0102 MOV DL, 41126B:0104 CALL 08A7: 0445执行上面程序:-G=100,109结果输出字符“A”。软中断程序调用,就是通过INT指令调用系统中断服务程序。上面例子看到,通过中断号可以从中断向量表中查出对应中断服务程序的入口地址,然后通过CALL指令调用,但是过于繁琐。一般调用中断服务程序可以通过硬件,或使用INT指令。INT指令一般格式为:INT 中断号计算机执行INT指令的过程是:根据中断号计算对应中断向量在中断向量表

9、中地址;从中断向量表中取出中断服务程序的入口地址,将中断服务程序段基址装入CS寄存器,偏移地址装入IP;计算机就转移到对应的中断服务程序执行;中断服务程序执行完毕返回被中断的程序继续执行。7.2 BIOS中断服务程序调用由计算机厂商提供的BIOS中断服务程序固化在ROM内,计算机启动后,这些中断服务程序的入口地址被装入中断向量表,用户可以通过硬件方式,或软中断方式调用BIOS中的中断服务程序。下面通过示例说明BIOS的键盘输入和视频输出中断服务程序的使用。一、键盘中断服务程序键盘中断服务程序中断号为16H,包含0H、1H、2H三个子功能。0h号子功能:读键盘输入的字符。当调用该子功能时,计算机

10、等待接收键盘输入。如果没有按键按下,则等待;如果有按键按下,则将按键的扫描码装入AH寄存器,将按键的ASCII码装入AL寄存器。因为键盘上的功能键,如,F1、F2、等,没有对应的ASCII码,所以,当按下的如果是功能键,AL=0,AH=对应键的扫描码。因此,可以调用0h号子功能识别是否有功能键按下。01H号子功能:从键盘缓冲区读一个字符,当键盘缓冲区不为空时,将ZF置0,将读取的ASCII码装入AL寄存器;当键盘缓冲区为空时,将ZF置1后返回。02H号子功能:读取双态键,或组合键的状态,返回值AL的对应位含义如图7.2.1所示。D7D6D5D4D3D2D1D0按下右shift键 按下左shif

11、t键 按下Ctrl键 按下Alt键 Scrollock键状态Numlock键状态Capslock键状态 Insert键状态Scrollock键状态 图7.2.1 键盘状态字节例721:调用键盘中断0H子功能,接收一个按键,如果是功能键F1打印字母“A”,如果是其它功能键打印字母“B”,否则不打印。DISP MACRO X ; ;显示字符宏定义 MOV DL, X MOV AH, 02H INT 21H ENDM.MODEL SMALL.CODE START: MOV AH, 0 INT 16H ;调用中断16h的0号子功能 CMP AL,0 ;是功能键否? JNE EXIT ;不是功能键,结束

12、。 CMP AH, 3BH ;是功能键F1否?3B是功能键F1的扫描码。 JNE F2 DISP A JMP EXIT F2: DISP B EXIT: MOV AH, 4CH INT 21H END START 例722:分别调用16H的01h和0H子功能接收键盘输入,并打印输入健的ASCII码。ROL14 MACRO Z ; 循环左移四次宏定义PUSH CXMOV CL, 4ROL Z, CLPOP CXENDMDISP MACRO ; 显示字符宏定义 PUSH AX MOV AH, 02H INT 21H POP AX ENDM.MODEL SMALL.CODE OUT16 PROC N

13、EAR ; 十六进制数输出过程 MOV CX, 2 L1:ROL14 AL MOV DL, AL AND DL, 0FH CMP DL, 9 JBE L2 ADD DL, 7 L2:ADD dl, 30h DISP LOOP L1 MOV DL, H DISP RET OUT16 ENDP调用01H子功能: START: L3: MOV AH, 1 INT 16H ; 调用中断16h的01H号子功能 JZ L3 ; 键盘缓冲如果为空返回L3 CALL OUT16 ; 调用十六进制数输出子程序 MOV AH, 4CH INT 21H END START 调用0H子功能: START: MOV A

14、H, 0 INT 16H ; 调用中断16h的0号子功能 CALL OUT16 ; 调用十六进制数输出子程序 MOV AH, 4CH INT 21H END START 有上面例子可以看到中断16H的0H子功能和DOS系统功能调用的01H子功能几乎是相同的,在程序中到底应当调用那一个好呢?一般来说如果不是特殊需要应尽量使用DOS系统功能。二、视频输出中断服务程序不同的显示控制器,显示输出的特性不同,主要包括显示分辨率和对图形的支持。目前PC 计算机多采用AVGA显示控制器,AVGA显示控制器兼容以前的CGA、EGA、和VGA所支持的特性。显示输出系统有多种工作模式,可以分为字符模式和图形模式两

15、大类,每一类又可按分辨率和颜色数分成不同的子模式。例如字符模式可以有25行40列、25行80列等模式;图形模式可以有分辨率640480,16种颜色;或分辨率640480,256种颜色等。字符模式下显示字符存入显示缓存,就会在显示器上显示出来。分为字符模式下的显示缓存的开始内存地址B8000H。显示缓存区分为若干页,每一页和一满屏数据相对应,使用时可以选择其中的一页。每个显示字符占用两个字节,前一个字节为字符的ASCII码,后一个字节为字符模式字符的属性。字符属性字节定义如下:位0位2 字符颜色,000:黑色字符, 001:带下划线, 111:白色字符等位3 字符亮度,0:普通亮度,1:高亮度位

16、4位 背景颜色,000:黑色背景,111:白色背景位7 字符闪烁,0:普通字符,1:闪烁字符图形模式的每个像素数据位数取决于可选择的颜色,例如640480,16色模式,每个像素需要4位二进制数,全屏共需要6404800.5=153600字节。图形模式将显示缓存区分成4个存储位平面,其开始地址为A0000H,每个位平面存储像素的一位,各个位平面的顺序号相同位组合成屏幕上一个像素。DOS系统将中断号10H分配给视频输出中断服务程序。10H中断包含0H13H子功能。下面介绍其中几个子功能:106H子功能功能:当前显示页上滚。输入参数:AL=上滚行数,0为初始化窗口(全屏幕)。 BH=字符填充属性。

17、CH/CL=左上角行/列坐标。 DH/DL=右下角行/列坐标。202H子功能功能:置光标位置。输入参数: BH=显示页号。 DH=行号。DL=列号。309H子功能功能:在当前光标位置显示字符输入参数: BH=显示页号。 BL=显示字符属性 CX=重复次数其中字符属性的各位定义如下:BLRGBIRGB背景前景亮度闪烁图7.2.2 字符属性例723:在显示器的指定位置显示文字。.MODEL SMALL.DATA STR DB How Are You! COUNT EQU $-OFFSET STR.CODE START: MOV AL, 0 ;AL=上卷行数,AL=0为清屏 MOV CL, 0 ;开

18、始行号 MOV CH, 0 ;开始列号 MOV DL, 79 ;结束行号 MOV DH, 24 ;结束列号MOV BH, 7 ;卷入行属性为黑底白字MOV AH, 06H ;子功能号06H送AH寄存器。 INT 10H ;调用10H的06H子功能清屏幕 MOV DH, 10 ;置光标到10行,33列 MOV DL, 33 ;光标列号MOV BH, 0 ;置显示页号MOV AH, 2 INT 10H ;调用02H子功能设置光标位置 MOV AX, DATA MOV DS, AX MOV SI, OFFSET STR MOV BL, 01110110B ;设置字符属性白底红字 MOV CX, CO

19、UNTL1: PUCH CX ;循环次数=显示字符数 MOV CX, 1 ;显示重复次数 MOV AH, 9 ;调用09h子功能显示字符 MOV AL, SI ;显示字符ASCII码装入AL寄存器 INT 10H ;显示字符 INC SI INC DI; ;光标左移 MOV AH,2 INT 10H ;重置光标位置 POP CX LOOP L1EXIT:MOV AH,4CH INT 21H END START运行上面程序在显示器的10行,33列开始显示白底红字的“How are you! ”。例724:在显示器上画一条20个像素的直线。下面程序调用了10H功能的0H和0CH子功能:0号子功能:

20、置显示模式,AL=显示模式代码,当AL=12H时的显示模式为640480像素,16色模式;0CH子功能:在屏幕上绘点,DX=开始行,CX=开始列,AL=颜色编码。.MODEL SMALL.CODE START: MOV AL, 12H MOV AH, 0 INT 10H ;设置640480,16色模式 MOV DX, 40 ;初始行 MOV CX, 50 ;开始列 L1: MOV AH, 0CH ;调用写像素功能 MOV AL, 7 ;设置颜色为白色 INT 10H ;画点 INC CX ;列数增1 CMP CX, 70 JNE L1 EXIT: MOV AH, 4CH INT 21H END

21、 START7.3 硬中断一、中断控制器除了通过INT指令调用中断服务程序,微型计算机可以通过硬件调用中断服务程序。控制硬中断的芯片是中断控制器,如早期的PC计算机使用Intel的8259中断控制器芯片,现在微机的中断控制器和其它一些部件一起集成为一块超大规模集成电路。中断控制器占用20h和21h两个I/O端口:120h对应中断控制器中的命令寄存器,可由CPU将中断控制命令代码写入到该寄存器,以控制中断控制器的工作方式。例如,20H为停止中断控制器工作代码,使用下面指令将结束中断:MOV AL, 20HOUT 20H, AL其中OUT指令是I/O输出指令,其执行的操作是将AL寄存器中的代码发送

22、到外设端口20H。中断控制器的其它命令需要了解中断控制器的内部结构和工作原理,过于复杂这里略去。2端口21h对应中断屏蔽寄存器,这是一个8位的寄存器,每一位和一个外部设备的中断信号相对应,将其中的某位置1,就会禁止该位对应的外部设备中断申请。DOS系统将如下中断号分配给硬中断服务程序:08H 时钟中断(IRQ0), 每秒钟执行18.2次;09H 键盘中断(IRQ1);0AH 保留;0BH 通讯口COM2(IRQ3);0CH 通讯口COM1(IRQ4);0DH LPT2(IRQ5);0EH 磁盘控制器(IRQ6);0FH LPT1(IRQ7);为了接入更多的外部设备,在微型计算机中将两片中断控制

23、器芯片级连方式在一起,其IRQ8IRQ15对应中断号为70H77H。二、中断控制器的工作原理当有外部设备发出中中断申请信号时,中断控制器向CPU的可屏蔽中断输入端发出中断申请信号,并同时将其对应的中断号通过数据线发送到CPU,CPU接到中断控制器的信号后,暂时中止执行正在执行的程序,根据中断控制器发来的中断号计算中断服务程序入口地址在中断向量表中的位置,将中断向量装入CS:IP,开始执行中断服务程序,中断服务程序执行结束后继续执行原来的程序。除了可以通过中断屏蔽寄存器屏蔽某外设的中断申请,将IF标志位置0,可以屏蔽所有中断控制器的中断申请。指令:CLI 将IF置零,关中断;STI 将IF置1,

24、开中断。7.4 中断程序设计有时用户需要设计自己的中断服务程序,用户设计的中断服务程序可以占用DOS系统为用户保留的中断号。中断服务程序应当遵循如下操作步骤:1中断服务程序应保护现场:将用到的寄存器压如堆栈保护;2关中断,禁止其它中断申请;3中断处理;4开中断;5向中断控制寄存器发出中断结束命令;6恢复现场;7返回下面程序是中断程序设计的示例。该程序中的RING过程为中断执行程序,当每次时钟信号到来时执行该过程一次。每次执行检查变量COUNT的值,如果COUNT等于100就显示字符串The bell is ring!,然后将COUNT清0;如果COUNT小于100不显示字符串,只是将COUNT

25、增1后返回。.MODEL SMALL.DATA MESS DB The bell is ring!,0DH,0AH,$ COUNT DW 1.CODE RING PROC NEAR PUSH DS PUSHU AX PUSH CX PUSH DX ;保护现场,将DS、AX、CX、DX值压入堆栈 MOV AX,DATA MOV DS, AX CLI ;关中断 INC COUNT CMP COUNT, 100 JNZ EXIT MOV DX, OFFSET MESS MOV AH, 09H INT 21H ;调用DOS的09H功能显示字符串 MOV COUNT, 0 ;恢复COUNT值EXIT:

26、STI ;开中断 MOV AL,20H OUT 20H, AL ;发中断结束命令 POP DX POP CX POP AX POP DS ;恢复现场 IRET ;中断返回 RING ENDP MAIN PROC FAR START:MOV AL, 1CH ;中断号1CH送AL寄存器 MOV AH, 35H INT 21H ;调用DOS的35H功能,取1CH 号中断向量 PUSH ES PUSH BX ;保存原中断向量 MOV DX, OFFSET RING ;变量RING的偏移地址送DXMOV AX, SEG RING MOV DS, AX ;取变量RING的段基址,送DS MOV AL, 1

27、CH MOV AH, 25H INT 21H ;调用DOS的25H功能,置1CH 号中断向量 L1: MOV AH, 01H ;读键盘缓冲区 INT 16H CMP AL, 0DH JNE L1 ;ZF=0,没有键按下返回L1 POP DX POP ES MOV AL, 1CH MOV AH, 25H INT 21H ;恢复原1CH中断向量 MOV AH, 4CH INT 21HMAIN ENDPEND START程序说明:11CH中断为DOS系统为用户程序保留的时钟中断,实际上08H中断直接调用该中断。系统内部时钟每隔18.2秒就向中断控制器发出一次中断请求信号,CPU响应该中断请求,执行1

28、CH号中断服务程序。2DOS 的35H功能为取中断向量: 入口参数:AL=中断号 出口参数:ES:BX=中断向量上面程序通过35H功能调用取出原中断向量值,将其压入堆栈保存。3DOS 的25H功能为设置中断向量: 入口参数:DS:DX=中断向量,AL=中断号 出口参数:无程序通过25H功能调用将过程RING的段基址和偏移地址存入中断向量表。4IRET为中断返回指令。CPU接到中断请求信号后,将当前执行程序的下一指令的地址压入堆栈保存后,响应中断,并执行中断服务程序。中断服务程序由IRET指令将保存在堆栈中的指令地址弹出到CS:IP,返回到被中断的程序。5由标号L1开始的程序段调用键盘中断16H的01H子功能循环扫描键盘,在循环过程中每间隔18.2秒响应一次时钟中断请求,执行RING过程。12

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1