《微机原理与接口技术第七章节2章节》由会员分享,可在线阅读,更多相关《微机原理与接口技术第七章节2章节(64页珍藏版)》请在金锄头文库上搜索。
1、第四节 中断程序设计,一、中断向量的保存、设置和恢复 二、软中断程序设计 三、可屏蔽硬中断程序设计 四、问题讨论,一、中断向量的保存、设置和恢复,1. 保存中断向量 (35H功能) 入口参数 AL = 要保存向量的中断类型号N 功能号 AH = 35H 类型号 21H 出口参数 BX = ( 0: N4 ) ES = ( 0: N4 +2 ) 实现功能 将类型号N 的中断向量保存在ES、BX中,方法一: 用堆栈保存中断向量 MOV AL, 09H ;取中断向量 MOV AH, 35H INT 21H PUSH ES ;用堆栈保存 PUSH BX 、 、,例 保存09H类型的中断向量 (如何保存
2、(ES ),(BX) ),方法二: 用变量保存中断向量 save_09cs DW ? ;定义变量 save_09ip DW ? 、 MOV AX, SEG save_09cs MOV DS, AX MOV AL, 09H ;取中断向量 MOV AH, 35H INT 21H MOV save_09cs , ES ;用变量保存 MOV save_09ip , BX,入口参数 AL = 要设置向量的中断类型号N DS:DX = 中断子程的入口地址(中断向量) 功能号 AH = 25H 类型号 21H 出口参数 无 实现功能 将类型N的中断向量设置在向量表中, 即 ( 0: N 4) =类型N中断子
3、程入口地址的偏移值 ( 0: N 4+2) =类型N中断子程入口地址的段值,2. 设置中断向量 (25H功能),例1 设置中断子程Sound 的中断向量,类型号为60H,code SEGMENT ASSUME CS:code start: 、 MOV AX, SEG sound MOV DS, AX MOV DX, Offset sound MOV AL, 60H MOV AH, 25H INT 21H 、 INT 60H ;调用60H中断子程 、 MOV AH,4CH INT 21H,; 中断子程 sound PROC 、 、 、 IRET sound ENDP code ENDS END
4、start,二、软中断程序设计,软中断子程与子程序的编写类似, 其不同点在于: 1子程用CALL指令调用;中断子程用INT指令调用 2子程用RET指令返回;中断子程用IRET指令返回 3CALL指令直接用过程名做操作数, 即由过程名提供子程的入口地址 INT指令由类型号N到中断向量表中固定的单元 获得中断子程的入口地址,对比 -软中断程序与子程序的编写其不同点在于: 1. 应在主程中将中断子程的入口地址(中断向量) 放入中断向量表中。(可用25H系统功能完成) 2. 主程中用INT指令调用中断子程 3. 中断子程应用IRET返回.,例:用子程编写和用一个60H类型的中断子程编写, 功能是将BX
5、寄存器的内容以16 进制形式显示出来。,list PROC ;子程 MOV CH, 4 MOV CL, 4 next: ROL BX, CL MOV DL, BL AND DL, 0FH ADD DL, 30H CMP DL, 39H JLE print ADD DL, 07H print: MOV AH,2H INT 21H DEC CH JNZ next RET ;子程返回 list ENDP code ENDS END start,三、可屏蔽硬中断程序设计,分三大步骤: 1 . 了解IBM PC/XT系统可屏蔽硬中断的响应过程, 据连线确定外设中断申请对应的中断类型号; 2主程中做好外设
6、发出中断申请,CPU能够响应的准备工作; 3编写可屏蔽硬中断子程,完成中断源请求的任务.,1 . 了解IBM PC/XT系统可屏蔽硬中断的响应过程, 据连线确定外设中断申请对应的中断类型号。,例 接口的中断申请连 IRQ3 类型号0BH 接口的中断申请连 IRQ5 类型号0DH,在主程序中应做的工作: CPU关中断 ( 用CLI置 IF=0 ) 保存原中断向量 ( 用35H系统功能 ) 设置中断向量 ( 用25H系统功能 ) 设置8259A的中断屏蔽字, 使21H端口对应位为0, 允许中断申请进入优先级裁决器 CPU开中断 (用STI置IF=1 ),2主程中做好外设发出中断申请,CPU能够响应
7、的准备工作。,准备工作做好后,此后若该级有中断申请, 则CPU响应中断,执行相应类型的中断子程。,主程在返回DOS前,应恢复原中断向量。( 用25H系统功能 ), 处理中断源申请任务部分的编写与普通子程类似 在中断子程结束前, 发中断结束命令清除 8259A 中ISR的记录; 否则,响应一次中断后, 同级中断和低级中断将被优先级裁决器屏蔽 用IRET中断返回指令返回主程被中断处,3编写硬中断子程,完成中断源请求的任务,时钟信号连接在IR0上,申请的中断类型号为08H。 时钟信号是一个频率为18.2HZ的方波信号, 即每秒向8259A发出18.2次的中断申请。 如果CPU响应该中断申请, 则以每
8、秒18.2次的频率执行08H类型的中断子程。,分析,中断申请的任务是每5秒显示一个字符A 1秒执行18.2次,则5秒执行18.25=91次, 只在执行到第91次时显示A,其它不显示。 在中断子程中用一个量来计数中断子程被执行的次数, 即CPU响应IR0中断申请的次数。 当达到91次,则显示A,并将计数值清0,重新计数; 其它情况只计数,不显示A。 中断子程的最后应发中断结束命令EOI。,code SEGMENT ASSUME CS:code start: CLI ;关中断 MOV AL, 08H MOV AH, 35H INT 21H ;取系统08H类型中断向量 PUSH ES ;用堆栈保存
9、PUSH BX PUSH DS MOV DX, OFFSET display ;设置08H 类型中断向量 MOV AX, SEG display MOV DS, AX MOV AL, 08H MOV AH, 25H INT 21H POP DS,程序清单:,IN AL, 21H ;设置8259A中断屏蔽字, AND AL, 1111 1110B ;允许IR0中断 OUT 21H, AL MOV CX, 0 ;置中断子程计数器初值为0 STI ;CPU开中断 MOV SI, 8000H ;用双重循环延时, w2: MOV DI, 8000H ;模拟CPU对其他任务的处理 w1: DEC DI ;
10、DI,SI的值可修改,控制主程执行时间 JNZ w1 DEC SI JNZ w2 POP DX ;恢复系统08H类型中断向量 POP DS MOV AL, 08H MOV AH, 25H INT 21H MOV AH, 4CH ;返回DOS INT 21H,display PROC ;自编的08H类型中断子程 PUSH AX ;保护现场 INC CX ;执行中断子程一次,计数值加1 CMP CX, 91 JNZ exit ;到91次了吗?未到跳转至exit MOV DL, A ;到,显示 A MOV AH, 02 INT 21H MOV CX, 0 ;清计数值为0,重新计时 exit: MOV
11、 AL, 20H ;发中断结束命令EOI OUT 20H, AL POP AX ;恢复现场 IRET ;中断返回 display ENDP code ENDS END start,系统08H类型中断子程要点: 进入子程后,修改了DS段寄存器的值; 程序中调用了1CH类型中断子程, 每执行一次08H中断子程, 执行一次1CH中断子程; 程序最后发中断结束命令EOI,sys08 PROC 、 MOV AX, 0040H MOV DS, AX 、 INT 1CH 、 MOV AL, 20H OUT 20H, AL IRET sys08 ENDP,1CH类型是软中断,按编写软中断子程方法编写: 系统0
12、8H中断子程改变DS值,故: 1CH中断子程用到定义的变量,须在子程中给DS赋值。 1CH类型是软中断,不需要发中断结束命令。,思考: 08H类型的中断子程为何具有定时功能? 假如08H中断子程中不发EOI,后果是什么? 1CH类型的中断子程为何具有定时功能? 上例(例2)改用1CH类型的中断子程来完成,程序如何修改?,说明: 键盘接口通过8259A的IR1发中断申请, 类型号09H 键盘接口对按下键和释放键都向8259A发出中断申请, 即若CPU满足响应条件,对键盘上的一个按键操作, CPU将执行两次09H类型的中断子程: 按下键一次,释放键一次 CPU可从60H端口读取操作键的扫描码, 每
13、个键对应有一个扫描码(P241) 由扫描码的D6D0判断操作的是哪一个键, 由扫描码的D7位判断是按下键,还释放键。 D7=1,释放键(断码); D7=0,按下键(通码) 键盘中断子程中应发中断结束命令, 在IBM PC/XT机上, 从60H端口读取扫描码后, 应向键盘接口(61H)置应答信号, 使键盘接口为接收下一个按键的扫描码做好准备。 不设应答信号,键盘接口不能正常工作。 在286以上微机,读取扫描码后,可不置键盘应答。,有关键盘 (补充) 键盘通过键盘接口电路与计算机连接。 键盘上的键有三种类型: 字符键 AZ, 09等 功能键 F1F12, Page Up等 组合控制键 Shift,
14、 Ctrl, Alt等, 键盘上的每个键都有一个扫描码。 据扫描码可确定操作的是哪个键、是按下键还是释放键; 扫描码用一个字节表示。 低7位是扫描码的数字编码, 与键盘上的键一一对应; 最高位D7位表示键的操作状态: 当按下键时, D7=0 ; 当释放键时, D7=1, 键盘中断子程功能(09H类型中断子程) 从键盘接口读取操作键的扫描码; 将扫描码转换成字符码; 大部分键的字符码为ASCII码, 无ASCII码键(如组合键Shift、Ctrl等)的字符码为0。 将键的扫描码、字符码存放在键盘缓冲区, 供其它有关键盘的中断子程应用。, 键盘接口对按下键和释放键均向计算机发出中断申请, 如果中断响应条件满足, CPU转去执行键盘中断子程。 键盘中断子程类型号为09H。,编程: 编写键盘中断子程, 完成每操作键盘上任意键,屏幕上显示 HeLLo!,IN AL, 21H ;设置8259A中断屏蔽字 AND AL, 11111101B ;允许IR1键盘中断 OUT 21H,